【问题标题】:printing stack trace for windows coredump without needing to enter windbg/visual studio interactively打印 Windows coredump 的堆栈跟踪,无需交互地进入 windbg/visual studio
【发布时间】:2014-07-07 19:04:58
【问题描述】:

我想通过调用脚本中编写的预定义命令来获取导致崩溃的线程的堆栈跟踪,以便我运行脚本并获得一个包含所有线程的回溯跟踪的日志文件。然后我可以解析此日志文件以查看是否存在已知问题。

【问题讨论】:

    标签: windows visual-studio windbg minidump


    【解决方案1】:

    我建议您查看cdb。这是windbg 的一个非常全功能的命令行版本,应该已经安装了windbg。

    您可以告诉它打开转储,打印堆栈跟踪并使用命令行退出:

    cdb -z yourdump.dmp -c "~*kv; q"
    

    或者您甚至可以花点时间进行一些自动分析:

    cdb -z yourdump.dmp -c "!analyze -v; q"
    

    这可能更有意义,因为它会在引发第二次机会异常时尝试恢复堆栈,而仅使用 k 打印堆栈将完全错过这个问题。您还可以利用它输出的FAILURE_BUCKET_ID 为您完成大部分分类工作。

    从那里开始,只需在要执行的命令之前使用.logopenredirecting the commandline output to a file

    【讨论】:

      【解决方案2】:

      您可以运行 WinDbg 或 Cdb,使用 -z 选项打开转储,-c 执行命令,-log 将输出转储到文件中,-y 设置符号路径。

      要从文件运行脚本,请尝试使用$<$><$$<$$><$$>a< 之一作为命令。阅读 WinDbg 帮助文件,了解它们之间的区别。

      通常不相关,但为了完整性:请注意一些commands are not scriptable (MSDN)

      【讨论】:

        【解决方案3】:

        如果 Dump 是 Full Kernel memory Dump(默认 64 kb Mini Dump(xp-sp3 大小)没有足够的线程堆栈信息)

        如果你在 mycomputers -> properties->advanced -> startup and recovery -> complete memory dump )

        可验证

        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:>

        您可以使用 !for_each_thread @#Thread 转储所有线程的堆栈跟踪

        下面的示例来自一个 xp-sp3 vm,配置为在连接到主机中的 kd 的蓝屏上写入完整的内存转储

        我发出 .crash 并让虚拟机崩溃

        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
        

        这会打开转储中的每个线程设置正确的进程上下文并将堆栈信息转储到文件并退出(根据转储大小可能需要几分钟/小时)

        当 vm 崩溃时,有 302 个线程正在运行,堆栈跟踪存储在 c:\foost.txt 中的所有 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:\>
        

        【讨论】:

        • 是你吗,blabb?让我有点恼火。
        • 这只是感觉你似乎失去了所有的声誉。您使用其他帐户吗?我想知道为什么:你刚刚获得了一些有用的特权,现在又从头开始了?有 11 声望,我什至不能邀请你聊天。
        猜你喜欢
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 2014-01-27
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 2015-07-27
        • 2020-07-25
        相关资源
        最近更新 更多