【问题标题】: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,我没有在调试器下运行应用程序

标签: .net c#-4.0 first-chance-exception procdump


【解决方案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/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多