我正在使用 Windbg 从托管代码(C#,为任何 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
我的困惑是,使用以下命令时,堆栈跟踪中没有显示行号信息。有什么想法有什么问题吗?我需要设置源路径吗?
0:016> ~6 e!clrstack
编辑 1:我在使用 !pe 和 !U 查找引发异常的堆栈跟踪时遇到了一些问题。
这是我的调试过程。起初我使用 !pe 打印异常对象的堆栈跟踪,当我使用 !U 反汇编代码时。我发现的问题是!U 将分解 FooService.ProcessOrders() 的所有函数代码,我想找到函数 FooService.ProcessOrders 中发生崩溃的确切位置。我还发现反汇编注释的 IL 代码只包含我所做的函数调用(对于非函数调用 C# 代码,例如 a=a*2,只显示汇编语言),不完全映射到每一行 C# 代码的 IL,( 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
提前感谢,乔治