- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试从转储中追踪 NullReferenceException。 NullReferenceException 不是崩溃异常,而是崩溃异常是带有 InnerException 的 TargetInvocationException,后者是 NullReferenceException。
我将 Windbg 与 SOS 一起使用,我使用命令 analyze -v
,这为我提供了 NullReferenceException 的调用堆栈:
EXCEPTION_OBJECT: !pe f6cb150
Exception object: 000000000f6cb150
Exception type: System.NullReferenceException
Message: Object reference not set to an instance of an object.
InnerException: <none>
StackTrace (generated):
SP IP Function
000000002CD9D8C0 000007FF01E7C639 MyDll!DoSomething2()+0xe99
000000002CD9DBE0 000007FF01E7B11D MyDll!DoSomething1()+0x43d
000000002CD9DD20 000007FF01E7AB11 MyDll!WorkerDoWork(System.Object, System.ComponentModel.DoWorkEventArgs)+0x51
000000002CD9DD80 000007FEEA68A0F2 System_ni!System.ComponentModel.BackgroundWorker.WorkerThreadStart(System.Object)+0x62
请注意,我得到的方法名称带有字节偏移量,但没有行号。 DoSomething2
是一个大函数,因此 NullReferenceException 发生的位置并不明显。
我尝试按照 Tess Ferrandez 博客中的说明进行操作:
.Net exceptions - Tracking down where in the code the exceptions occurred
但我很早就陷入了尝试使用 !ip2md 和 DoSomething2 的 IP 确定方法 DoSomething2
的方法描述符的地方:7FF01E7C639:
> !ip2md 7FF01E7C639
Failed to request MethodData, not in JIT code range
请注意,!ip2md 命令在发生 TargetInvocationException 的方法的 IP 上成功。
问题:
从这里我可以从哪里开始缩小 DoSomething2 中崩溃的行的范围?请注意,我无法重现崩溃,所以我只有这个(和几个重复的)转储。
附加说明:
编辑 1
当我没有正确设置符号时,我得到以下信息:
STACK_TEXT:
00000000`2cd9d8c0 00000000`ffffffff MyDll!Unknown_0xe99+0xe99
00000000`2cd9dbe0 00000000`ffffffff MyDll!Unknown_0x43d+0x43d
00000000`2cd9dd20 00000000`ffffffff MyDll!Unknown_0x51+0x51
00000000`2cd9dd80 00000000`ffffffff system_ni! System.ComponentModel.BackgroundWorker.WorkerThreadStart+0x62
当我将它设置为指向我的符号服务器并打开 !sym noisy 时,它似乎正确地加载了符号:
0:000> ld MyDll
DBGHELP: C:\Program Files\Debugging Tools for Windows (x64)\MyDll.dll - file not found
SYMSRV: c:\symbols\MyDll.dll\4F3D6F4B154000\MyDll.dll not found
SYMSRV: http://msdl.microsoft.com/download/symbols/MyDll.dll/4F3D6F4B154000/MyDll.dll not found
SYMSRV: \\mysymbolserver\store\Mydll.dll\4F3D6F4B154000\file.ptr
SYMSRV: MyDll.dl_ from \\mysymbolserver\store: uncompressed
DBGHELP: c:\symbols\MyDll.dll\4F3D6F4B154000\MyDll.dll - OK
DBGENG: c:\symbols\MyDll.dll\4F3D6F4B154000\MyDll.dll - Mapped image memory
SYMSRV: c:\symbols\MyDll.pdb\8AFC2BE7529A41289FA9FBCEDB6836161\Mydll.pdb not found
SYMSRV: http://msdl.microsoft.com/download/symbols/Mydll.pdb/8AFC2BE7529A41289FA9FBCEDB6836161/MyDll.pdb not found
SYMSRV: \\mysymbolserver\store\MyDll.pdb\8AFC2BE7529A41289FA9FBCEDB6836161\file.ptr
SYMSRV: MyDll.pd_ from \\mysymbolserver\store: uncompressed
DBGHELP: MyDll - private symbols & lines
c:\symbols\MyDll.pdb\8AFC2BE7529A41289FA9FBCEDB6836161\MyDll.pdb
Symbols loaded for MyDll
编辑2
我尝试使用 !name2ee 如下:
0:000> !name2ee MyDll!MyType.DoSomething2
Module: 000007ff004995b8
Assembly: Autodesk.DataManagement.Client.Framework.Vault.dll
<invalid module token>
所以,运气不好。但后来我似乎几乎有了这个:
0:000> !name2ee MyDll.dll!MyNamespace.MyType
Module: 000007ff004995b8
Assembly: MyDll.dll
Token: 000000000200008c
MethodTable: 000007ff01b2e258
EEClass: 000007ff01b415e0
Name: MyNamespace.MyType
0:000> !dumpmt -md 7ff01b2e258
EEClass: 000007ff01b415e0
Module: 000007ff004995b8
Name: MyNamspace.MyType
mdToken: 000000000200008c
File: C:\Program Files\MyCompany\MyProduct\Bin\MyDll.dll
BaseSize: 0x30
ComponentSize: 0x0
Slots in VTable: 31
Number of IFaces in IFaceMap: 2
--------------------------------------
MethodDesc Table
Entry MethodDesc JIT Name
000007feeb31a2c0 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007feeb3689f0 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007feeb3688c0 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007feeb353440 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01b01300 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01e89140 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01b9c080 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01f45f40 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01a9b358 000007ff01b2e128 NONE MyType.DoSomething3()
000007ff01a9b360 000007ff01b2e130 NONE MyType.DoSomething4()
000007ff01a9b368 000007ff01b2e138 NONE MyType.DoSomething5()
000007ff01e79800 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff020fea80 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01a9b3b0 000007ff01b2e1b0 NONE MyType.DoSomething6()
000007ff01a9b3b8 000007ff01b2e1b8 NONE MyType.DoSomething7()
000007ff01a9b328 000007ff01b2e0f0 NONE MyType..ctor()
000007ff01b01280 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01e7a810 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01e7aac0 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01e83240 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01f19520 000007ff01b2e178 JIT MyType.RunWorkerCompleted(System.Object, System.ComponentModel.RunWorkerCompletedEventArgs)
000007ff01e7ace0 0000000000000000 JIT 0000000000000000 is not a MethodDesc
000007ff01e7b7a0 0000000000000000 JIT 0000000000000000 is not a MethodDesc
000007ff01e7b710 0000000000000000 JIT 0000000000000000 is not a MethodDesc
000007ff01e7d2b0 0000000000000000 JIT 0000000000000000 is not a MethodDesc
000007ff01b015f0 0000000000000000 JIT 0000000000000000 is not a MethodDesc
000007ff01b88ce0 0000000000000000 JIT 0000000000000000 is not a MethodDesc
000007ff01a9b3e0 000007ff01b2e200 NONE MyType.DoSomething8()
000007ff01b921e0 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01b933b0 0000000000000000 NONE 0000000000000000 is not a MethodDesc
000007ff01b93870 0000000000000000 NONE 0000000000000000 is not a MethodDesc
我猜测所有缺失的条目(那些以“不是 MethodDesc”列出的条目)是因为这不是一个完整的小型转储。是吗?
最佳答案
看起来 WinDbg 没有为您的 DLL 选择符号。您可以通过设置符号路径并使用 !sym noisy
来查看它必要时进行故障排除。
我说不出为什么!ip2md
在这种情况下不起作用,但还有其他方法可以获取 DoSomething2
的代码.尝试 !name2ee
在方法名称上,例如!name2ee *!TypeName.DoSomething2
或者你可以像这样通过类型本身获得它 !name2ee *!Namespace.TypeName
然后 !dumpmt -md <method table>
在您从 !name2ee
获得的方法表上.
获得代码后,!u
命令可以向您显示汇编代码的 .NET 注释转储。通过使用异常的偏移量,您可以确定 NullReferenceException 的性质。
关于c# - 使用 WinDbg 从 minidump 中确定 InnerException 的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12692747/
在我的代码中,我使用典型的 try..catch 抛出并捕获了异常。异常中的消息是 执行查询时发生错误。请检查堆栈跟踪以获取更多详细信息。还有一个带有消息 ValidationException wa
何时检查 Exception 类及其派生类的 InnerException 属性?微软的“异常最佳实践”没有提供任何关于何时检查内部异常的建议。我应该只在异常被重新抛出并在我的代码中捕获时才这样做吗?
当我在该对象的构造函数中时,如何设置 Exception 对象的 InnerException 属性?这归结为查找和设置没有 setter 的属性的支持字段。 顺便说一句:我看过这个evain.net
在我多年的编程中,我从未见过这种情况发生,不得不问问是否有其他人知道这是为什么...... Excel.Worksheet worksheet; Excel.S
Regarding the duplicated. I can access the Message property but not the Detail property even when I
我有如下代码来捕获使用 TaskFactory 和 Task.Run 创建的任务抛出的异常。如果我使用 TaskFactory,则无需使用 Task.WaitAll 方法即可检查 Continued
我在服务器上有以下代码: if (actualRowCount > maxRows) { throw new DomainException("OverMaxRowLimitException
有什么方法可以编写 LINQ 样式的“速记”代码来遍历抛出异常的所有级别的 InnerException 吗?我更愿意就地编写它,而不是调用扩展函数(如下所示)或继承 Exception 类。 sta
显示我的完整 InnerException 的正确方法是什么。 我发现我的一些 InnerExceptions 有另一个 InnerException 并且这很深入。 InnerException.T
如何使用 Log4NET 记录内部异常? 这是我当前的转换模式: 最佳答案 控制台和文件附加器自动打印异常。异常:消息、堆栈跟踪和所有内部异常(再次使用堆栈跟踪)都记录在单独的行上,并且不遵循转换模
基本上,我的问题简短而有趣:以下是一个坏主意吗(封装并重新抛出 ex.InnerException 而不是 ex) (有一个类似的问题 here,但不完全...我想重新封装 InnerExceptio
我正在通过反射调用一个可能导致异常的方法。如何在没有包装器反射的情况下将异常传递给我的调用者? 我正在重新抛出 InnerException,但这会破坏堆栈跟踪。 示例代码: public void
我目前正在记录错误并希望获得尽可能多的描述性细节。我知道我可以捕获许多不同类型的异常,但 Exception.Message 之间有什么区别?和 Exception.InnerException.Me
我有一个带有操作契约(Contract)的 WCF 服务 void AddQuery(IQuery Query); 我的IQuery是这样的 public interface IQuery {
对于我正在开发的一个简单的控制台应用程序,我想实现一个非常基本的异常处理(只是打印异常消息并终止程序)。我要实现的逻辑是:如果异常有内部异常,则打印内部异常;否则打印自己的异常消息。 我尝试使用新的
我正在尝试使用 Entity Framework 将一个实体插入到我的数据库中。见下文: private void InsertarIntoDataBase() { Juego game =
使用 Visual Studio 2012 Express,当从外部代码框架引发 System.TypeInitializationException 时,如何检查 InnerException。调试
我们的(相当大的)代码库有一些这样的结构: try { DoSomething(); } catch (Exception e) { CleanUp(); throw new
简介 当用户在 NLog 配置中创建错误(如无效的 XML)时,我们 (NLog) 会抛出一个 NLogConfigurationException。异常包含错误的描述。 但有时如果对 NLog 的第
我一直在查看我们的一个应用程序中的一些代码,如下所示: catch (AggregateException ae) { this._logger.Log(ae.Flatten().InnerE
我是一名优秀的程序员,十分优秀!