Probleme mit SymGetModuleInfo64



  • Hallo,

    habe derzeit ein Problem mit der Funktion SymGetModuleInfo64 und zwar schlägt sie immer fehl :p
    GetLastError sagt mir Error 87: Falscher Parameter, allerdings kapiere ich nicht, was ich falsch machen sollte. Hier mein Codesnippet:

    IMAGEHLP_MODULE64	Module;
    
    memset( &Module, 0, sizeof(IMAGEHLP_MODULE64));
    Module.SizeOfStruct = sizeof(IMAGEHLP_MODULE64);
    
    SymGetModuleInfo64( hProcess, sf.AddrPC.Offset, &Module );
    

    hProcess hole ich zwar nicht über GetCurrentProcess (-1), sondern es ist ein "richtiges" Handle auf meinen Prozess.

    dwProcessId	= GetCurrentProcessId();
    hProcess	= OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwProcessId );
    

    und sf.AddrPC.Offset wird mir von der Funktion StackWalk64 zurückgegeben.

    Ich habe auch den Artikel von Jochen durchgelesen: http://blog.kalmbachnet.de/?postid=67
    Komischerweiße funktioniert das Testprogramm bei mir auch nicht, SymGetModuleInfo64 schlägt auch dort fehl! Könnte es wirklich an dem Bug liegen? Im System Verzeichniss ist zwar die Ver. 5.1.2600.2180 der Dbghelp.dll aber im Verzeichniss \\Debugging Tools for Windows\\ liegt die Ver. 6.6.0007.5 ?

    Hoffe hier kann mir jemand helfen...

    @Jochen: Sollte man sich bei deinem Codebeispiel nicht das Auflisten der Module über CreateToolhelp32Snapshot und das Laden dieser mit SymLoadModule64 sparen können, wenn man stattdessen bei SymInitialize den dritten Parameter von FALSE auf TRUE stellt? Und vl. solltest du auch noch dazuschreiben, dass UNICODE definiert sein muss um den Code kompilieren zu können.



  • Welche Version von dbgehlp.dll wurde denn nun wirklich geladen?
    Kannst Du es mit meinem Beispiel auch nachvollziehen?



  • Geladen wurde beides mal 5.1.2600.2180, auch für dein Beispiel.
    Dein Beispiel schlägst ebenfalls exakt bei der Funktion SymGetModuleInfo64 fehl.

    Beides wird mit VS 7.1 und dem 2003 R2 March Edition PSDK kompiliert.



  • Ich hab das von DIr erwähnte PSDK nicht zu Hand... kannst Du mal die Definition der Struktur "IMAGEHLP_MODULE64" hier posten?
    Im mitgelieferten PSDK von VC2003 sieht es so aus:

    typedef struct _IMAGEHLP_MODULE64 {
        DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)
        DWORD64                     BaseOfImage;            // base load address of module
        DWORD                       ImageSize;              // virtual size of the loaded module
        DWORD                       TimeDateStamp;          // date/time stamp from pe header
        DWORD                       CheckSum;               // checksum from the pe header
        DWORD                       NumSyms;                // number of symbols in the symbol table
        SYM_TYPE                    SymType;                // type of symbols loaded
        CHAR                        ModuleName[32];         // module name
        CHAR                        ImageName[256];         // image name
        CHAR                        LoadedImageName[256];   // symbol file name
    } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
    

    Vermutlich ist die Struktur im neuen PSDK größer geworden und da hat die Funktion wohl noch ein Bug drin...

    Im aktuellen dbghelp.h sieht die Struktur ja so aus:

    typedef struct _IMAGEHLP_MODULE64 {
        DWORD    SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)
        DWORD64  BaseOfImage;            // base load address of module
        DWORD    ImageSize;              // virtual size of the loaded module
        DWORD    TimeDateStamp;          // date/time stamp from pe header
        DWORD    CheckSum;               // checksum from the pe header
        DWORD    NumSyms;                // number of symbols in the symbol table
        SYM_TYPE SymType;                // type of symbols loaded
        CHAR     ModuleName[32];         // module name
        CHAR     ImageName[256];         // image name
        // new elements: 07-Jun-2002
        CHAR     LoadedImageName[256];   // symbol file name
        CHAR     LoadedPdbName[256];     // pdb file name
        DWORD    CVSig;                  // Signature of the CV record in the debug directories
        CHAR         CVData[MAX_PATH * 3];   // Contents of the CV record
        DWORD    PdbSig;                 // Signature of PDB
        GUID     PdbSig70;               // Signature of PDB (VC 7 and up)
        DWORD    PdbAge;                 // DBI age of pdb
        BOOL     PdbUnmatched;           // loaded an unmatched pdb
        BOOL     DbgUnmatched;           // loaded an unmatched dbg
        BOOL     LineNumbers;            // we have line number information
        BOOL     GlobalSymbols;          // we have internal symbol information
        BOOL     TypeInfo;               // we have type information
        // new elements: 17-Dec-2003
        BOOL     SourceIndexed;          // pdb supports source server
        BOOL     Publics;                // contains public symbols
    } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
    

    Wenn Du mal in meinen Stackwalker.cpp reinschaus (Funktion "GetModuleInfo"), dann siehst Du, dass ich vor dem gleichen Problem stand... (und habs dann aber aufgegeben).
    Es scheint so, also ob in der dbghelp.dll ein Vergleich der Struktur-Größe auf "==" (maximal "<=") erfolgt... was ja weder auf noch abwärtskompatibel ist...
    Und da Du nun Header verwendest welche von einem aktuellen PSDK stammen und die dbghelp.dll in einer Version wo es die neuen Struktur-Elemente noch nicht gab, kommt es nun zu einem Konflikt.

    Fazit: Du musst due passende dbghelp.dll mitliefern (also am besten die neueste).



  • PS: Du kannst auch in die Funktion reindebuggen, dann siehst Du das Problem...

    Jetzt hab ich auch meine "Diskussion" mit Pat Styles wieder gefunden:
    http://groups.google.de/group/microsoft.public.windbg/msg/8ced0295726a4be4



  • Also die Struktur sieht bei meinem PSDK 2003 R2 March Edition so aus:

    typedef struct _IMAGEHLP_MODULE64 {
        DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)
        DWORD64                     BaseOfImage;            // base load address of module
        DWORD                       ImageSize;              // virtual size of the loaded module
        DWORD                       TimeDateStamp;          // date/time stamp from pe header
        DWORD                       CheckSum;               // checksum from the pe header
        DWORD                       NumSyms;                // number of symbols in the symbol table
        SYM_TYPE                    SymType;                // type of symbols loaded
        CHAR                        ModuleName[32];         // module name
        CHAR                        ImageName[256];         // image name
        // new elements: 07-Jun-2002
        CHAR                        LoadedImageName[256];   // symbol file name
        CHAR                        LoadedPdbName[256];     // pdb file name
        DWORD                       CVSig;                  // Signature of the CV record in the debug directories
        CHAR			            CVData[MAX_PATH * 3];   // Contents of the CV record
        DWORD                       PdbSig;                 // Signature of PDB
        GUID                        PdbSig70;               // Signature of PDB (VC 7 and up)
        DWORD                       PdbAge;                 // DBI age of pdb
        BOOL                        PdbUnmatched;           // loaded an unmatched pdb
        BOOL                        DbgUnmatched;           // loaded an unmatched dbg
        BOOL                        LineNumbers;            // we have line number information
        BOOL                        GlobalSymbols;          // we have internal symbol information
        BOOL                        TypeInfo;               // we have type information
    } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
    

    Beim Header der bei den Debugging Tools for Windows dabei war, siehts wie bei dir aus. Und so wie ich das verstanden habe ist keine Version mit einer anderen DLL, als der dazu ausgelieferten kompatibel. Autsch!

    Wenn ich mit dem PSDK von VS 7.1 kompiliere funktioniert die Funktion 🙄
    Also mit dem neuen PSDK hatte ich bisher nur Probleme 😞

    PS.: Wie kann ich in die SymGetModuleInfo64 Funktion reindebuggen?
    PPS.:

    yogle schrieb:

    @Jochen: Sollte man sich bei deinem Codebeispiel nicht das Auflisten der Module über CreateToolhelp32Snapshot und das Laden dieser mit SymLoadModule64 sparen können, wenn man stattdessen bei SymInitialize den dritten Parameter von FALSE auf TRUE stellt?

    MSDN schrieb:

    fInvadeProcess
    [in] If this value is TRUE, enumerates the loaded modules for the process and effectively calls the SymLoadModule64 function for each module.

    Kann man sich das jetzt das explizite laden der geladenen DLLs über SymLoadModuleInfo64 sparen, oder nicht?



  • yogle schrieb:

    Beim Header der bei den Debugging Tools for Windows dabei war, siehts wie bei dir aus. Und so wie ich das verstanden habe ist keine Version mit einer anderen DLL, als der dazu ausgelieferten kompatibel. Autsch!

    Wenn ich mit dem PSDK von VS 7.1 kompiliere funktioniert die Funktion 🙄
    Also mit dem neuen PSDK hatte ich bisher nur Probleme 😞

    Es liegt nicht am PSDK, sondern an den Programmierern der dbghelp.dll (ist bei MS leider ein eigenes Team und weder an das OS noch an das PSDK angebunden...).

    yogle schrieb:

    PS.: Wie kann ich in die SymGetModuleInfo64 Funktion reindebuggen?

    In VS musst Du dazu zuerst Ctrl-F11 drücken (Assembler ansicht) und dann kannst Du ganz normal mit F10 auf dem "cal"-Befehl reinspringen.

    yogle schrieb:

    MSDN schrieb:

    fInvadeProcess
    [in] If this value is TRUE, enumerates the loaded modules for the process and effectively calls the SymLoadModule64 function for each module.

    Kann man sich das jetzt das explizite laden der geladenen DLLs über SymLoadModuleInfo64 sparen, oder nicht?

    Ich hab da kein Vertrauen und lade die Symbole lieber selber...


Anmelden zum Antworten