【问题标题】:How to get a stack-trace after halt instruction in windbg without using the GUI?如何在不使用 GUI 的情况下在 windbg 中的停止指令后获取堆栈跟踪?
【发布时间】:2013-02-27 03:28:24
【问题描述】:

通常我在我的 C++ 代码中插入一个 assert(0);,启动 Windbg,按 F5,输入 k,然后我得到一个堆栈跟踪。然后我必须通过鼠标复制粘贴它并退出。

但我想自动执行此操作。有什么方法可以检索堆栈跟踪并将其写入文本文件而无需手动使用 GUI?

【问题讨论】:

    标签: windows windbg


    【解决方案1】:

    首先,您可以使用.logopen 将 gui 的输出写入文本文件,就像这样

    .logopen c:\dump\myLog.txt
    

    这会将所有内容转储到该位置,调用.logclose 以在一行中关闭日志:

    .logopen c:\dump\myLog.txt; k; .logclose
    

    其次,如果你真的不想使用gui,有windbg的命令行版本,cdb。您可以使用以下命令执行此操作:

    cdb -log c:\data\myLog.txt -lines -pn myApp.exe -c ".symfix;.reload;k;qd"
    

    这将打开调用堆栈的行号,输出到日志,使用名称附加到您的进程,然后在双引号中执行命令,修复 MS 的符号服务器,重新加载,转储调用堆栈并退出和分离。

    【讨论】:

    • -pn 需要一个现有进程,但是如何让 cdb 运行一个新进程?我需要相当于windbg myapp.exe arg1 arg2。编辑:啊,我只需要在参数之后传递它们。
    • 嗯,这几乎可以工作,除了cdb 似乎没有从可执行文件中加载符号,因此堆栈跟踪不可用。 windbg 没有这个问题。
    • 使用-i c:\myApp-y c:\myApp\mySymbol 作为cdb 的参数怎么样?看到这个link了解更多信息
    【解决方案2】:

    假设您不再尝试对其进行调试,而只是尝试获取堆栈跟踪,那么只需调用此函数并将输出写入文件。

    CaptureStackBackTrace (http://msdn.microsoft.com/en-us/library/bb204633(VS.85).aspx?ppud=4)

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 2016-05-12
      • 2017-10-31
      相关资源
      最近更新 更多