2017-10-06 2 views
1

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:

Thread View

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 
+0

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

+0

Ah, gibt es eine Möglichkeit, verschiedene Rahmentypen auszuprobieren? –

Antwort

2

.kframes <FrameCountDefault>:

Der .kframes Befehl legt die Standardlänge einer Stack-Trace-Anzeige.

[...]

Wenn Sie nie den .kframes Befehl ausgeben, ist die Standardanzahl 20 (0x14).

Wenn Sie den Befehl k verwenden, können Sie auch eine Länge angeben, z. k Lfff

Verwandte Themen