我想获得一个线程的堆栈跟踪,它通过调用脚本中编写的预定义命令导致崩溃,因此我运行脚本并获得一个包含所有线程的后跟踪的日志文件。然后,我可以解析此日志文件以查看是否存在已知问题。
答案 0 :(得分:4)
我建议你看看cdb
。它是一个非常全功能的windbg命令行版本,应该已经安装了windbg。
您可以告诉它打开转储,打印堆栈跟踪并使用命令行退出:
cdb -z yourdump.dmp -c "~*kv; q"
或者您甚至可以通过以下方式获得幻想并进行自动分析:
cdb -z yourdump.dmp -c "!analyze -v; q"
这可能更有意义,因为它会在抛出第二次机会异常时尝试恢复堆栈,只需用k
打印堆栈就会完全错过这个问题。您还可以使用FAILURE_BUCKET_ID
输出来为您执行大部分分类。
从那里开始,只需在您希望执行.logopen
或redirecting the commandline output to a file的命令之前使用。
答案 1 :(得分:4)
您可以使用-z
选项运行WinDbg或Cdb来打开转储,-c
执行命令,-log
将输出转储到文件中,-y
转到设置符号路径。
要从文件运行脚本,请尝试使用$<
,$><
,$$<
,$$><
或$$>a<
之一作为命令。阅读WinDbg帮助文件,了解它们之间的差异。
通常不相关,但为了完整性:请注意一些commands are not scriptable (MSDN)。
答案 2 :(得分:2)
如果转储是完整内核内存转储(默认64 kb迷你转储(xp-sp3大小)没有关于线程堆栈的足够信息)
多数民众赞成如果你已经设置了我的计算机 - &gt; properties-&gt; advanced - &gt;启动和恢复 - &gt;完成内存转储)
可验证
F:\>reg query hklm\system\currentcontrolset\control\crashcontrol /v DumpFile
! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINE\system\currentcontrolset\control\crashcontrol
DumpFile REG_EXPAND_SZ %SystemRoot%\MEMORY.DMP
F:&GT;
你可以使用!for_each_thread @#Thread来转储所有线程的堆栈跟踪
以下示例来自xp-sp3 vm,配置为在连接到主机中的kd的蓝屏上写入完整的内存转储
我发出.crash并崩溃vm
kd> .crash
Shutdown occurred at (Tue Jul 8 11:10:51.421 2014 (UTC + 5:30))...unloading all symbol tables.
Waiting to reconnect...
重新启动目标时写入MEMORY.DMP,我将其复制到主机共享文件夹(也可以在目标中执行,但此vm没有在目标中安装windbg,因此复制到主机)
我运行此命令
F:\>cdb -c ".logopen c:\\foost.txt;!for_each_thread !thread @#Thread 16; .logclo
se;q" -z c:\sharedwithvm\MEMORY.DMP
这将打开转储中的每个线程设置正确的进程上下文并将堆栈信息转储到文件并退出(基于转储大小可能需要几分钟/小时)
当pm为c:\ foost.txt中存储的所有302个线程的崩溃堆栈跟踪时,vm运行了302个线程C:\>cdb -c ".shell -ci \"!for_each_thread .echo @#Thread ;q\" wc -l" -z c:\share
dwithvm\MEMORY.DMP | grep -A 1 Reading
kd> cdb: Reading initial command '.shell -ci "!for_each_thread .echo @#Thread ;q
" wc -l'
303 <---------------
C:\>grep ChildEBP foost.txt | wc -l
302 <---------------------
C:\>