【发布时间】:2016-08-03 15:59:22
【问题描述】:
我在 Windows 10 主机上有一台虚拟 Windows 7 x64 机器,我使用 windbg 10.0.10586.567 对其进行内核调试。我在上面运行我自己的应用程序,我有完整的源代码和私有符号。每当我闯入并询问应用程序线程的堆栈跟踪时,当我的应用程序的一个二进制文件被“命中”时,回溯总是停止。
例如,如果我闯入,切换到进程,并使用!thread [thread address] 1f 请求堆栈跟踪,我会得到类似这样的信息(注意最后一行的“早期”零返回地址):
fffff880`0534e870 fffff800`026d6992 nt!KiSwapContext+0x7a
fffff880`0534e9b0 fffff800`026d81a2 nt!KiCommitThreadWait+0x1d2
fffff880`0534ea40 fffff800`029c7a2e nt!KeDelayExecutionThread+0x186
fffff880`0534eab0 fffff800`026d08d3 nt!NtDelayExecution+0x59
fffff880`0534eae0 00000000`76e7165a nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffff880`0534eae0)
00000000`00276708 000007fe`fcf91203 ntdll!NtDelayExecution+0xa
00000000`00276710 00000001`410e7dd9 KERNELBASE!SleepEx+0xab
00000000`002767b0 00000000`00000000 MyApp!MainMessageLoop+0x4b1 [d:\whatever\path\myapplication.cpp @ 3024]
这看起来与您在调试 x64 进程的用户模式转储(缺少展开数据)时丢失二进制文件非常相似,但在这种情况下,堆栈跟踪通常不会“突然”停止,而是它在那一点上误入歧途,并显示出虚假的价值。
我尝试过的一些额外信息/事情:
- 我设置了正确的符号路径(Microsoft 符号服务器和主机上具有匹配 PDB 的本地文件夹,即使堆栈跟踪不需要后者)
- 我在主机上设置了一个二进制路径 (
.exepath),其中包含匹配的二进制文件(我对此非常确定;将二进制文件直接从客户机复制到主机) - 如果我在应用程序导出的 DLL 函数之一中设置断点,那么当调试器中断时,我会得到一个单行堆栈跟踪,如下所示:
0000000000274b40 0000000000000000 MyAppDLL!SomeExportedFunction+0x32 [d:\whatever\path\myapplicationDLL.cpp @ 232] - 我几乎尝试了所有命令组合来获取堆栈跟踪(
.process /i、.process /r /p、!process -1 7、.reloads、.reload /users、.reload /f MyApp.exe、!thread [address] 1f等)没有成功 - 也尝试了旧版本的 windbg (
6.11.0001.404),结果相同 - 还尝试在 Windows 8.1 上作为访客使用完全相同的二进制文件,结果相同
-
!sym noisy输出(不相关行省略):0: kd>.process /i [address] 0: kd>g 0: kd>.reload /user 0: kd> !process -1 2 0: kd> !thread [address] 1f [...] DBGHELP: d:\symbolcache\MyApp.pdb\76931C5A6C284779AD2F916CA324617E1\MyApp.pdb already cached DBGHELP: MyApp - private symbols & lines [...] -
lmvm MyApp输出:[...] Loaded symbol image file: MyApp.exe Image path: C:\MyApp\MyApp.exe [...]
有什么想法吗?
【问题讨论】:
-
也许
.thread /p /r <addr>; kb? -
@MarcSherman 结果相同:(
-
您是否在 GFlags (
!gflag +ksl) 中启用了内核符号加载?这个名字有点误导。您需要让用户符号正常工作。 -
@conio 我在 Win 7 和 Win 8.1 上都试过了(在目标上也安装了 Windows SDK,可能有点矫枉过正),问题仍然存在。
!gflag报告ptg - Enable pool tagging和ksl - Enable loading of kernel debugger symbols我错过了什么吗? -
你似乎做对了一切。您能否将
.fnent的输出添加到作为堆栈的一部分显示的函数上(在您提供的示例中为MyApp!MainMessageLoop)?此外,您可能想从CMKD extensions 尝试!stack。
标签: windows debugging windbg stack-trace symbols