WinDbg 没有显示整个调用堆栈?
WinDbg not showing entire call stack?
我正在尝试使用 WinDbg 调试一款名为 "Ballmaster" 的非常古老的游戏(我没有其源代码)。当显示对话框时,我将 WinDbg 附加到游戏中,这样 UI 线程的调用堆栈就不会改变。
这是 运行 个主题的列表:
当我点击 Ballmaster
线程时,出现以下调用堆栈:
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
是主要的 UI 线程,它在对话框创建时被冻结。但是,记录在调用堆栈中的最底部函数是 DlgBox!Ordinal49
,它位于 DlgBox.dll
中,由可执行文件加载。
显然这不是完整的调用堆栈,因为这是主线程,可执行文件中的 main()
方法不能有 exited/returned 否则进程将关闭.
那么为什么调用堆栈以 DLL 中的函数而不是主可执行文件中的函数结束? 如何查看完整的调用堆栈?
!address DlgBox!Ordinal49+0x52bf
呈现以下内容:
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
.kframes <FrameCountDefault>
:
The .kframes command sets the default length of a stack trace display.
[...]
If you never issue the .kframes command, the default count is 20 (0x14).
如果使用k
命令,还可以指定长度,例如k Lfff
我正在尝试使用 WinDbg 调试一款名为 "Ballmaster" 的非常古老的游戏(我没有其源代码)。当显示对话框时,我将 WinDbg 附加到游戏中,这样 UI 线程的调用堆栈就不会改变。
这是 运行 个主题的列表:
当我点击 Ballmaster
线程时,出现以下调用堆栈:
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
是主要的 UI 线程,它在对话框创建时被冻结。但是,记录在调用堆栈中的最底部函数是 DlgBox!Ordinal49
,它位于 DlgBox.dll
中,由可执行文件加载。
显然这不是完整的调用堆栈,因为这是主线程,可执行文件中的 main()
方法不能有 exited/returned 否则进程将关闭.
那么为什么调用堆栈以 DLL 中的函数而不是主可执行文件中的函数结束? 如何查看完整的调用堆栈?
!address DlgBox!Ordinal49+0x52bf
呈现以下内容:
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
.kframes <FrameCountDefault>
:
The .kframes command sets the default length of a stack trace display.
[...]
If you never issue the .kframes command, the default count is 20 (0x14).
如果使用k
命令,还可以指定长度,例如k Lfff