Ich versuche, ein sehr altes Spiel namens "Ballmaster" (dessen Quellcode ich nicht besitze) mit WinDbg zu debuggen. Ich habe WinDbg an das Spiel angehängt, wenn ein Dialog angezeigt wird, so dass sich der Aufruf-Stack des UI-Threads nicht ändert. HierWinDbg zeigt nicht den gesamten Call-Stack?
ist eine Liste der laufenden Threads:
Wenn ich auf dem Faden Ballmaster
klicken, wird der folgende Aufruf-Stack vorgestellt:
ntdll!NtDelayExecution + 0xc
KERNELBASE!SleepEx + 0x99
KERNELBASE!Sleep + 0xf
USER31!HookedCreateWindowExA + 0x41
DlgBox!Ordinal49 + 0x35dd
DlgBox!Ordinal49 + 0x4d58
uxtheme!ThemePreDefDlgProc + 0x83
USER32!UserCallDlgProcCheckWow + 0x2a8
USER32!DefDlgProcWorker + 0xc7
USER32!DefDlgProcA + 0x25
USER32!_InternalCallWinProc + 0x2b
USER32!UserCallWinProcCheckWow + 0x2d3
USER32!SendMessageWorker + 0x26c
USER32!InternalCreateDialog + 0xb07
USER32!CreateDialogIndirectParamAorW + 0x35
USER32!CreateDialogIndirectParamA + 0x1b
DlgBox!Ordinal49 + 0x52bf
Ballmaster
ist der Haupt-UI-Thread , und es wird bei der Dialogerstellung eingefroren. Die unterste Funktion, die in der Aufrufliste aufgezeichnet wird, ist jedoch DlgBox!Ordinal49
, die in gefunden wird, die von der ausführbaren Datei geladen wird.
Offensichtlich ist das nicht der komplette Aufrufstack, da aufgrund der Tatsache, dass das der Hauptthread ist, die main()
Methode in der ausführbaren Datei nicht hätte beendet werden können, da andernfalls der Prozess schließen würde.
Warum endet der Aufrufstack mit einer Funktion in einer DLL statt einer Funktion in der Hauptdatei? Wie kann ich den gesamten Call-Stack anzeigen?
!address DlgBox!Ordinal49+0x52bf
präsentiert die folgenden:
Usage: Image
Base Address: 028e1000
End Address: 028f2000
Region Size: 00011000 ( 68.000 kB)
State: 00001000 MEM_COMMIT
Protect: 00000020 PAGE_EXECUTE_READ
Type: 01000000 MEM_IMAGE
Allocation Base: 028e0000
Allocation Protect: 00000080 PAGE_EXECUTE_WRITECOPY
Image Path: C:\Users\mathu\Desktop\Games\Ballmaster\CrtC0B.tmp\DlgBox.DLL
Module Name: DlgBox
Loaded Image Name: C:\Users\mathu\Desktop\Games\Ballmaster\CrtC0B.tmp\DlgBox.DLL
Mapped Image Name:
More info: lmv m DlgBox
More info: !lmi DlgBox
More info: ln 0x28e52bf
More info: !dh 0x28e0000
aber wenn * pdb * -Dateien (mit Frame-Informationen) nicht für alle Module im Stack verfügbar sind - in x86 ist es unmöglich, immer volle Stack-Trace zu erhalten. Debugger nehmen an, dass die Funktion * ebp * frame ('push ebp; mov ebp, esp 'am Anfang) verwendet und von dieser * ebp * -Kette durchlaufen wird. Aber wenn einige Funktionen diesen Rahmen nicht verwenden, kann der Stack-Trace gestoppt werden. – RbMm
Ah, gibt es eine Möglichkeit, verschiedene Rahmentypen auszuprobieren? –