【问题标题】:What does the windbg command "kd" do?windbg 命令“kd”有什么作用?
【发布时间】:2010-03-20 05:39:53
【问题描述】:

我错误地运行了 kd 并得到了一些让我感兴趣的输出,这是对我模块中的一行代码的引用,我在任何线程的调用堆栈上都看不到。这些行不是方法的开始,所以我不认为引用是对函数指针的引用,但可能是异常存储在内存中的结果???当然,这恰好是我正在寻找的......

更新:

异常的堆栈跟踪是:

0:000> kb
   *** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr  Args to Child              
0174f168 734ea84f 2cb9e950 00000000 2cb9e950 kernel32!LoadTimeZoneInformation+0x2b
0174f1c4 734ead92 00000022 00000001 000685d0 msvbvm60!    RUN_INSTMGR::ExecuteInitTerm+0x178
0174f1f8 734ea9ee 00000000 0000002f 2dbc2abc msvbvm60!    RUN_INSTMGR::CreateObjInstanceWithParts+0x1e4
0174f278 7350414e 2cb9e96c 00000000 0174f2f0 msvbvm60!    RUN_INSTMGR::CreateObjInstance+0x14d
0174f2e4 734fa071 00000000 2cb9e96c 0174f2fc msvbvm60!RcmConstructObjectInstance+0x75
0174f31c 00976ef1 2cb9e950 00591bc0 0174fddc msvbvm60!__vbaNew+0x21

并进入我们的代码(创建一个新的 Form 派生类)

dds 输出:

0:000> dds esp-0x40 esp+0x100
0174f05c  00000000
0174f060  00000000
0174f064  00000000
0174f068  00000000
0174f06c  00000000
0174f070  00000000
0174f074  00000000
0174f078  00000000
0174f07c  00000000
0174f080  00000000
0174f084  00000000
0174f088  00000000
0174f08c  00000000
0174f090  00000000
0174f094  00000000
0174f098  00000000
0174f09c  007f4f9b ourDll!formDerivedClass::Form_Initialize+0x10b [C:\Buildbox\formDerivedClass.frm @ 1452]

这似乎表明 Initialize 正在被调用,即使它不在此异常或任何线程的堆栈跟踪中。正如建议的那样,pdbs 和 dlls 之间可能完全不匹配,但我们最终使用正确的类和方法似乎是一个巧合

【问题讨论】:

    标签: exception windbg


    【解决方案1】:

    Kd 代表“堆栈转储”。来自文档:

    kd 命令显示原始堆栈 数据。每个 DWORD 值都显示在 单独的一行。符号信息是 一起显示这些行 与相关的符号。这种格式 创建一个比 其他 k* 命令。 kd 命令是 相当于一个 dds(显示内存) 使用堆栈地址的命令 它的参数。

    尝试 .hh 从 ntsd / windbg 中获取调试器帮助。

    另见“dds esp-0x40 esp+0x80”

    【讨论】:

    • 那么,如果这些堆栈行不是线程调用堆栈的一部分,为什么还会出现这些堆栈行呢?是否有一个命令可以将它们中的一个追溯到调用函数,以便我可以看到它们为什么在那里?
    • 不看输出很难说。如果您正在调试优化代码(发布),堆栈可能会变得非常时髦。调试器只是尝试将地址与符号匹配——有时它会出错。如果确实没有意义,则可能是堆栈损坏或您加载了错误的符号(pdb 不匹配)。
    • 我很确定 pdb 是匹配的(我们重建了二进制文件以更早地获取 pdb)。现在用更多信息更新问题
    • 我不熟悉用这种方式调试VB异常...对不起。
    【解决方案2】:

    对不起,看起来您实际上运行了“kb”命令——使用的是“B”,而不是“D”。这就是上面会话中出现的内容,http://www.debuginfo.com/articles/easywindbg.html 上的示例肯定会产生类似的输出......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 2012-08-07
      相关资源
      最近更新 更多