为啥我没有获得第一次机会异常的转储文件

Posted

技术标签:

【中文标题】为啥我没有获得第一次机会异常的转储文件【英文标题】:Why I don't get a dump file for first chance exception为什么我没有获得第一次机会异常的转储文件 【发布时间】:2014-08-22 14:52:02 【问题描述】:

这是应该生成第一次机会异常的代码。

class MyClass

    public string SomeField  get; set; 

class Program

    static void Main(string[] args)
    

        try
        
            Print(null);
        
        catch  

    


    static void Print(MyClass myclass)
    
        Console.WriteLine(myclass.SomeField);
    

我如下设置 ProcDump 来捕获故障转储。

ProcDump -ma MyApplication.exe

据我了解,此命令应同时捕获第一次机会和第二次更改异常。但是对于上面的代码,我没有得到任何异常。如果从我的代码中删除 catch 块,那么我会得到一个转储文件,但应该是第二次机会异常。任何想法为什么我没有第一次机会得到任何崩溃转储?

【问题讨论】:

我很确定“第一次机会异常”只是调试器的事情。 ProcDump 只会在应用程序未处理的异常情况下触发,因此会在操作系统上传递。用调试器的话来说,这些是“第二次机会异常”。为什么,确切地说,你想收集第一次机会异常的转储?为什么不能只使用调试器调试那些? 我当然可以,但我想了解是否可以捕获第一次机会异常。我将命令更改为 ProcDump -ma -e 1 MyApplication.exe,它也应该捕获第一次机会,但仍然没有看到任何捕获的转储文件。 您是否在运行带有调试器的应用程序?如果是这样,它会在 ProcDump 处理它之前首先获取异常。不过,听起来你已经知道的比我多。我不知道 ProcDump 有一个-e 1 选项。 :-) nops,我没有在调试器下运行应用程序 【参考方案1】:

你没有正确使用它,它不会害羞地告诉你。将您的代码更改为:

static void Main(string[] args) 
    Console.WriteLine("Okay, start ProcDump now and press Enter");
    Console.ReadLine();
    try 
        Print(null);
    
    catch  

考虑将 DebugDiag 作为替代方案。

【讨论】:

实际上我的代码中有 Console.ReadLine() 以便 ProcDump 可以找到该进程。抱歉,我不应该从代码中删除该行。 不,您不应该删除它。当我测试它时,这很好用。 procdump.exe -ma -e 1 控制台应用程序1.exe。切换并按 Enter,bam,48 兆字节的 .dmp 文件。还有什么我们不知道的? ProcDump 实际显示什么? 其实我的错,Console.ReadLine() 在错误的地方。你是男人:) 顺便说一句,关于您使用 DebugDiag 的建议,是否可以针对未运行的进程进行配置? 回答@PaulSnow 的最后一个问题(这晚了很多年,但可能对其他人有所帮助)- 我在DebugDiag 中还没有找到这样做的方法。根据我的经验,在您创建规则时,该过程必须仍在运行,以便您可以选择它。此后(如果规则仍处于活动状态)DebugDiag 应继续收集故障转储以供将来运行。 blogs.msdn.microsoft.com/kaushal/2012/05/09/…

以上是关于为啥我没有获得第一次机会异常的转储文件的主要内容,如果未能解决你的问题,请参考以下文章

ntdll 0XC0000005 Windbg 中的第一次机会异常

发生了第一次机会异常......我不知道为啥

如果没有人调用该函数,为啥我会得到第一次机会异常?

在VS2010中加载dll文件时的第一次机会异常

在第一次机会 OutOfMemoryException 上触发转储的问题

没有编译错误的第一次机会异常