【问题标题】:is it possible to get the line from which the exception was thrown from a dump?是否可以从转储中获取引发异常的行?
【发布时间】:2012-10-11 00:18:58
【问题描述】:

我有一个转储文件并用 WinDbg 加载它。

我使用 !pe(打印异常)来查看异常(空引用异常)。但是,它为我指出了一个包含约 100 行的方法。

是否可以找出抛出异常的那一行?

    0:000> !pe
   Exception object: 00000000822e7e28
    Exception type:   System.NullReferenceException
    Message:          Object reference not set to an instance of an object.
    InnerException:   <none>
    StackTrace (generated):
SP               IP               Function
00000000001FBDC0 000007FF06468F6B Utils.Page.OnActivate()+0x6db

+0x6db 是什么意思?

非常感谢, 丹

编辑:

我有源文件,但我无法重现此问题。这就是为什么我想找出确切的行

EDIT2:(在 Brian 建议使用 !u 命令之后)

这是使用 !u 命令后的快照

    0:000> !u 000007ff03af9a38
   Normal JIT generated code
  Page.OnActivate()
  Begin 000007ff06468890, size 84b
  000007ff`06468890 53              push    rbx
  000007ff`06468891 55              push    rbp
  000007ff`06468892 56              push    rsi
  000007ff`06468893 57              push    rdi
  000007ff`06468894 4883ec78        sub     rsp,78h
  000007ff`06468898 488d6c2430      lea     rbp,[rsp+30h]
  000007ff`0646889d 488bf2          mov     rsi,rdx

等等……

06468890(第一个指针)加6db对吗?

【问题讨论】:

  • +0x6db 是偏移量。您需要 PDB 和从中创建 PDB 和程序集的确切源代码。然后你应该能够得到行号。
  • @vcsjones 我有源代码和 pdb。如何计算行号?
  • 布赖恩的回答包括这一点。您需要 .reload 将 PDB 与程序集放在同一目录中,或者使用 .sympath 告诉 WinDbg 在哪里寻找 PDB,然后 .reload

标签: .net debugging windbg


【解决方案1】:

+0x6db 是引发异常的方法OnActivate 的偏移量。您看不到行号的原因是您没有正确的 PDB 文件。如果您有 PDB 文件,请将您的路径设置为包含这些文件。

如果不这样做,您仍然可以很好地指示异常发生的位置。 !u 命令将列出代码的 .NET 注释版本,您应该能够从中获取源代码中的位置。有关使用!u 命令的更多详细信息,请参阅this answer

【讨论】:

  • Brian,你能告诉我一些关于如何使用 !u 命令的细节吗?我在您的其他答案中使用了 !dumpmt -md : !dumpmt -md 000007ff03af9c50 。然后我用了!u 000007ff03af9a38(000007ff03af9a38是方法描述)并得到了汇编代码。 Begin 000007ff06468890, size 84b 000007ff`06468890 53 push rbx etc ...我如何找到行号?
  • 对不起,让我澄清一下:使用!u 命令不会直接找到行号。但是,程序集将使用 .NET 代码详细信息进行注释,因此您应该能够将其与源代码相关联。此外,异常的位置将在!u by &gt;&gt;&gt; 的输出中突出显示。如果方法很大,您将不得不查看一些汇编代码。找到标记后,查看注释并将其与源代码相关联。
  • @DanDinu 我认为您应该将IP(指令指针)传递给!u。因此,!u 000007FF06468F6B。然后寻找布赖恩写的>>>。
  • 如果您有私有 sym,请使用 !sosex.muf。它将交错源代码、IL 和本机代码。
  • @BrianRasmussen Brian,没有“>>>”指向 !u 输出中的异常。另外,我似乎无法理解您在说什么注释。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多