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
-
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.aspUmstieg 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?
-
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-7FD5E14DB6C0Alle 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?