私人符号已加载,但没有显示行号?

Geo*_*ge2 3 .net c# debugging windbg crash-dumps

我正在使用Windbg从托管代码(C#,为Any CPU构建的控制台应用程序)加载故障转储,并在x64平台上创建故障转储.我在x64平台上调试.

我使用以下命令加载我的应用程序的私有符号.以下是我在Windbg中使用的命令.

(set symbol path and copy FooService.pdb pdb file to local symbol path D:\Debug)

0:016> .reload /f
.*** WARNING: Unable to verify checksum for FooService.exe
DBGHELP: FooService.pdb- private symbols & lines 
         D:\Debug\FooService.pdb

0:016> lm
start             end                 module name
00000000`00400000 00000000`0041c000   FooService C (private pdb symbols)  D:\Debug\FooService.pdb
Run Code Online (Sandbox Code Playgroud)

我的困惑是,当使用以下命令时,堆栈跟踪中不显示行号信息.有什么想法有什么不对?我需要设置源路径吗?

0:016> ~6 e!clrstack
Run Code Online (Sandbox Code Playgroud)

编辑1:我遇到了使用!pe和!U找到引发异常的堆栈跟踪的一些问题.

这是我的调试过程.首先,我使用!pe来打印异常对象的堆栈跟踪,当我使用!U来组装代码时.我找到的问题是!你将组装FooService.ProcessOrders()的所有函数代码,我想找到函数FooService.ProcessOrders发生崩溃的确切位置.我还发现反汇编带注释的IL代码只包含我所做的函数调用(对于非函数调用C#代码,例如a = a*2,只显示汇编语言),并不完全IL映射到每行C#代码,( 1)是正确的预期行为吗?(2)从我在此处发布的分析中找到确切的失败C#代码的解决方案或进一步建议是什么?

!pe 0000064280155325

StackTrace (generated):
    SP               IP               Function

    000000001A56DA70 00000642B74E3B7A System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(System.Data.Common.DbAsyncResult, System.String, Boolean)
    000000001A56DB10 00000642B74E3FCC System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
    000000001A56DB90 0000064280155325 FooService.ProcessOrders()
    000000001A56F3E0 0000064280153A21 FooService.RountineJob()

!U 0000064280155325 
Run Code Online (Sandbox Code Playgroud)

先谢谢,乔治

Bri*_*sen 5

WinDbg/SOS不会将行号映射到输出!clrstack.因此,只要lm告诉您自己的程序集有私有pdb符号,就可以正确设置.不幸的是,当前版本的WinDbg/SOS不支持与本机代码相同的源级调试.

编辑:关于例外.当你这样做时!pe,它会告诉你调用堆栈以及相关方法的偏移量.如果从!pe输出的IP列获取地址并对其执行操作!U,您将看到相关方法的JITTED代码.IP列将是生成异常的代码的最后一个地址(因此您必须进行一些计数才能找到正确的指令).

反汇编的输出使用.NET调用进行注释,因此不难将其映射到IL或源代码.这应该可以帮助您准确识别您正在寻找的抛出语句.

话虽如此,如果将方法拆分为许多较小的方法,您将使调试变得更容易.如果这样做,方法名称通常足以精确定位异常的位置.我意识到这并不总是一种选择,但值得考虑.