none
Fonctionne sous XP, pas sous Vista. RRS feed

  • Question

  • Bonjour,

     

    Je suis auteur d'un logiciel pour l'industrie du jeu vidéo et du cinéma d'animation. Cela fait maintenant deux semaines que je suis passé à VC8 pour la compilation et le déployement de mon application.

     

    Notez que cette application est basée sur la library wxWidgets. Notez aussi que les exemples de code de cette library (version 2.8.4) ont été compilés et executés avec succés aussi bien sur Vista que sur XP.

     

    Mon problème est le suivant : Je constate depuis le changement de vc7 à vc8 une imcompatibilité visible au lancement de l'application sous vista (je n'ai aucun problème sous XP, l'application fonctionne comme avant).  Je précise qu'avec vc7 , je n'avais pas de problèmes avec vista.

     

    Le message d'erreur sous vista en mode RELEASE est le suivant : "unfold3dstudio.exe à cesser de fonctionner ... windows receuille etc...". Ensuite j'obtient un message de la Runtime Library : " L'application n'a pas réussi à s"initialiser correctement (0x80000003). "

     

    Le message d'erreur sous vista en mode DEBUG est le suivant :

    "Windows has triggered a breakpoint in unfold3dstudio.exe

     

     this may be due to a corruption of the heap, and indicates a bug in unfold3dstudio.exe or any of the DLLs it has loaded.

     

    The output window may have more diagnostic information" 

     

    Voici une copie de la pile d'appel :

     

    Code Snippet
      ntdll.dll!77722ea8()  
      [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
    > msvcr80d.dll!__CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=1, void * lpreserved=0x0116fd24)  Line 355 C
      msvcr80d.dll!_CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=1, void * lpreserved=0x0116fd24)  Line 214 + 0x11 bytes C
      ntdll.dll!7774a604()  
      ntdll.dll!7770c8f9()  
      ntdll.dll!7770ccf7()  
      ntdll.dll!7770e4f8()  
      ntdll.dll!7773fea0()  
      ntdll.dll!77707c46()  
      ntdll.dll!7770c8cb()  
      ntdll.dll!777700aa()  
      ntdll.dll!77714c41()  
      ntdll.dll!77715ad7()  
      ntdll.dll!77716862()  
      ntdll.dll!7771a980()  

     

     

     

    Voici une copie d'une partie de code pointee par visual lors de la session de debogage :

     

    Code Snippet

    #if defined (_CRT_CHECK_MANIFEST)

    if (!_check_manifest(hDllHandle))

    {

    __try

    {

    _NMSG_WRITE(_RT_CHECKMANIFEST);

    }

    __except( EXCEPTION_EXECUTE_HANDLER )

    {

    OutputDebugString(_GET_RTERRMSG(_RT_CHECKMANIFEST));

    DebugBreak();

    }                                                                 <===== Arret ici

    _ioterm(); /* shut down lowio */

    _mtterm(); /* free TLS index, call _mtdeletelocks() */

    _heap_term(); /* heap is now invalid! */

    return FALSE;

    }

     

     

    Voici mes flags de Compil (en mode debug) :

    Code Snippet
    cl /nologo -c   /Od /Z7 /EHsc /MDd /RTC1 /D WIN32 /D _WINDOWS /D _CRT_SE
    CURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_DEPRECATE    /D
     WINDOWS  /D "BUILD_MULTIUVSET"  /D "BUILD_NOSECURE"  -I./src -I..\DevelLib503\/
    src/ /I../DevelExternal/superlu_3.0/SRC/ /I../DevelExternal/Glut/  /D "__WXMSW__
    " /D "_WINDOWS" /D "NOPCH" /D "_VC80_UPGRADE=0x0600"  -I../DevelExternal/wxWidge
    ts-2.8.4//lib/vc_lib/mswd -I../DevelExternal/wxWidgets-2.8.4//include  -I../Deve
    lExternal/wxWidgets-2.8.4//src/regex -I../DevelExternal/wxWidgets-2.8.4//src/reg
    ex -I../DevelExternal/wxWidgets-2.8.4//src/png -I../DevelExternal/wxWidgets-2.8.
    4//src/zlib -I../DevelExternal/wxWidgets-2.8.4//src/jpeg -I../DevelExternal/wxWi
    dgets-2.8.4//src/jpeg -I../DevelExternal/wxWidgets-2.8.4//src/tiff  -D "BUILD_NO
    SECURE" -D "BUILD_SURFOPTIM"   -D "BUILD_PACKING"  -D "BUILD_OPTIMPACKINGTOOLS"
    -D "BUILD_MULTIUVSET"  -D "BUILD_IMPORTUV" -D "BUILD_CUTTINGTOOLS"   -D "BUILD_N
    OSAVINGFUNCS" -DPROGRAMNAME=\""Unfold3D Studio Edition DEMO "\" -DPROGRAMVERSION
    =\""5.0.3"\"  src/cunfoldthread.cpp /Foobj/cunfoldthread.obj

     

     


     

    Voici mes flags de Link (mode debug aussi) :

     

    Code Snippet
    link /nologo  /STACK:10000000  /DEBUG /SUBSYSTEM:WINDOWS /MACHINE:X86 /I
    NCREMENTAL:NO OpenGL32.lib Iphlpapi.lib /NODEFAULTLIB:LIBC /NODEFAULTLIB:LIBCMT
    /NODEFAULTLIB:ADVAPI32.dll /NODEFAULTLIB:WSOCK32.dll glu32.lib  kernel32.lib use
    r32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib oldnames.lib c
    omctl32.lib odbc32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib w
    sock32.lib ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxbase28d.lib ../DevelEx
    ternal/wxWidgets-2.8.4//lib/vc_lib/wxregexd.lib ../DevelExternal/wxWidgets-2.8.4
    //lib/vc_lib/wxpngd.lib ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxzlibd.lib
     ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxjpegd.lib ../DevelExternal/wxWid
    gets-2.8.4//lib/vc_lib/wxtiffd.lib  ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib
    /wxmsw28d_core.lib ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxmsw28d_adv.lib
     ../DevelExternal/wxWidgets-2.8.4//lib/vc_lib/wxexpatd.lib ../DevelExternal/wxWi
    dgets-2.8.4//lib/vc_lib/wxmsw28d_gl.lib  ../DevelExternal/wxWidgets-2.8.4//lib/v
    c_lib/wxmsw28d_richtext.lib netapi32.lib wsock32.lib ..\DevelLib503\/keylok/kfun
    c32.lib obj/cappframe.obj obj/cappwx.obj obj/cbitmap.obj obj/cglcanvas3d.obj obj
    /cgllisthandler.obj obj/ckeymousemap.obj obj/cmessage.obj obj/coperation.obj obj
    /cpackingprefwindow.obj obj/cunfold3dprefwindow.obj obj/cunfoldthread.obj obj/sh
    owbigtext.obj obj/trackball.obj src/unfold3d.res ..\DevelLib503\/bin/libunfold3d
    .lib  ../DevelExternal/Glut/GLUT32.LIB  /OUT:bin/unfold3dstudio.exe

     

     

     

    Notez aussi que j'ai réduit le code d'initialisation de la wxWidget au minimum vital :

    Code Snippet

    // fichier main.cpp

     

    IMPLEMENT_APP(MyApp)

     

    bool MyApp::OnInit()

    {

      // l'excution n'atteint pas cette ligne.

     

     return true;

    }

     

     

     

     

    Comme vous le voyer, il n'y a pas de code à remettre en question puisqu'il n'y a pas de code provenant de ma part, et je ne pense pas que le problème viennent du code d'initialisation de la library wxWidget. Il s'agit donc surrement d'un problème de chargement DLL, d'un problème de fichier manifest, ou d'un problème de flag de compil / link.  Il s'agit surrement d'une chose toute bête, mais je ne vois pas. Avez-vous une idée, une méthodologie de résolution à me proposer, ou un conseil ?

     

    Merci par avance,

     

    Salutation à l'équipe,

     

    Rémi Arquier

    Développement Unfold3D

    http://www.unfold3d.com

     

     

     

     

     

    lundi 6 août 2007 10:57

Toutes les réponses

  • Bonjour,

     

    Je pense qu'il doit vraiment y avoir un écrasement mémoire quelque part.

    Vista et XP doivent allouer la mémoire de façon différente, et donc le bug est détecté sous Vista et pas sous XP.

    As-tu déjà essayé le flags CRTDBG_MAP_ALLOC ? C'est assez efficace!

     

    Rémi

    mardi 7 août 2007 05:35
  • Bonjour Rémi,

    Je viens de résoudre à l'instant le problème (et je suis extrèmement soulagé Smile )

    En incluant le fichier manifest dans l'executable (avec mt) ET en effaçant les dll de la crt que j'avais honteusement copié à la main, tout marche très bien.

    Ce qui est bizzare dans tout ça, c'est que si je n'inclu pas le manisfet dans l'exe (c-a-d en le laissant dans le même répertoire que l'exe), les DLL ne sont pas trouvées. bizzare bizzare.

    Merci quand même pour ton aide !

    Rémi
    mardi 7 août 2007 11:20