Dbghelp.dll Versions Mist



  • Hallo,

    ich verwende in meinem Programm die beiden Funktionen SymGetModuleInfo64 und SymFromAddr und sie haben auch schon mal beide funktioniert 😉

    Soll heißen, ich habe jetzt eine andere Version der Dbghelp.dll (derzeit 5.1.2600) und wenn ich diese verwende funktioniert SymGetModuleInfo64 nicht mehr, SymFromAddr geht. Wenn ich allerdings die Version 6.6.7.5 verwende, funktioniert SymFromAddr nicht mehr und dafür geht SymGetModuleInfo64 😮

    So kann man doch net arbeiten!?!?
    Weiß da jemand eine Lösung wie ich beide zum laufen bekomme?

    Gruß
    yogle


  • Mod

    Was funktioniert wie nicht? Was sagt GetLastError?



  • Hmm hatte ich noch gar nicht nach geschaut 🙄

    Wenn SymFromAddr und SymGetModleInfo64 fehlschlagen sagt GetLastError bei beiden : 87, Falscher Parameter.

    Ich will mal behaupten mein Code "stimmt" er ist aber sozusagen nicht mit den verschiedenen Dbghelp Versionen kompatibel. Oder anderstrum 😉

    Muss ich irgendwie eine der Strukturen SYMBOL_INFO oder IMAGEHLP_MODULE64 verändern? Jochen meinte da mal etwas, dass die Dbghelp da teilweiße ein Check macht, ob die übergebenen Strukturen passen, da ja auch diese sich mit den Versionen ändern???



  • Was willst Du denn machen?
    Das ist leider mit dem dbghelp.dll so... deshalb verwende ich i.d.R. diese DLL nur per LoadLibrary/GetProcAddress...
    Die h-Dateien sind nicht wirklich schön gepflegt...
    Dbghelp.dll hat aber teilweise intern auch noch fehler und fängt solche Dinge leider nicht immer konkret ab; hab ich leider auch schon ein paar mal erlebt...
    Kann Dir leider nicht ganz konkrekt was Empfehlen, so lange ich den Code nicht genau sehe...



  • Hmm okay,

    der Code ist eigentlich straight forward, ist bastle ne Art kleinen Debugger. Möglicherweise könnte ich SymGetModuleInfo64 mit VirtualQuery ersetzen. Mit der Funktion möchte ich eigentlich im Callstack nur das Modul herausfinden.

    Über SymFromAddr mit UnDecorateSymbolName möchte ich den Symbol-/Funktionsnamen herausbekommen, das muss gehen. Oder sollte ich vl. die ältere Funktion nutzen (SymGetSymFromAddr64)?

    Das Problem ist halt ich kann nicht festlegen mit welcher Dbghelp.dll mein Programm später arbeitet, wenn es mal auf einem anderen PC läuft!

    Bisher benutze ich die SYMBOL_INFO Struktur aus dem 2003 R2 PSDK.
    Die hier:

    typedef struct _SYMBOL_INFO {
        ULONG       SizeOfStruct;
        ULONG       TypeIndex;        // Type Index of symbol
        ULONG64     Reserved[2];
        ULONG       info;
        ULONG       Size;
        ULONG64     ModBase;          // Base Address of module comtaining this symbol
        ULONG       Flags;
        ULONG64     Value;            // Value of symbol, ValuePresent should be 1
        ULONG64     Address;          // Address of symbol including base address of module
        ULONG       Register;         // register holding value or pointer to value
        ULONG       Scope;            // scope of the symbol
        ULONG       Tag;              // pdb classification
        ULONG       NameLen;          // Actual length of name
        ULONG       MaxNameLen;
        CHAR        Name[1];          // Name of symbol
    } SYMBOL_INFO, *PSYMBOL_INFO;
    

    Gibt es da keine Minimalstruktur die "immer" funktioniert?

    Umsteigen auf imagehlp.dll wird auch nicht helfen oder?



  • Hast Du schon mal meinen Stackwalker angeschaut? Da hab ich glaub irgendwie rumgetrickst...
    http://www.codeproject.com/threads/StackWalker.asp

    Umstieg auf imghelp.dll ist nicht so sinnvoll, da dies erstens nicht mehr unterstützt wird, und zweitens die Aufrufe nur durchreicht...



  • Okay habs jetzt hinbekommen. Beim StackWalker mal reingeschaut...
    Ab wann wurde denn die Version 5.1.2600 ausgeliefert? Mit XP?


  • Mod

    WinXP SP2 hat die Version 5.1.2600.2180

    Die letzte freie (separat herunter zu ladende) Version ist die 5.0.2195
    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=CD1FC4B2-0885-47F4-AF45-7FD5E14DB6C0

    Alle späteren Versionen sind an die Debug Utilities oder das OS gebunden und dürfen nicht mehr weitergegeben werden.



  • Ist diese separat zu erhaltende DLL älter als die mit Win 2000 ausgeliefert wurde?

    Ich hab mein Programm jetzt mal mit der 5.0.2195 laufen lassen. Allerdings werden jetzt die Debuginformationen über mein Programm nicht mehr ausgelesen. Von z.B. der kernel32.dll werden angezeigt.

    Liegt das an einem neuen Format der Debuginformationen die der VC 8.0 Compiler/Linker erstellt?


Anmelden zum Antworten