Почему я не получаю файл дампа для исключения первого шанса

Вот код, который должен генерировать исключение первого шанса.

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 из моего кода, я получу файл дампа, но это должно быть исключение второго шанса. Любые идеи, почему я не получаю аварийный дамп для первого шанса?


person crazy novice    schedule 22.08.2014    source источник
comment
Я почти уверен, что исключения первого шанса - это только отладчик. ProcDump будет запускаться только для исключений, которые не обрабатываются приложением и, следовательно, передаются операционной системе. Говоря языком отладчика, это исключения второго шанса. Почему именно вы хотите собирать дампы исключений первого шанса? Почему вы не можете просто отладить те, которые используют отладчик?   -  person Cody Gray    schedule 22.08.2014
comment
Я, конечно, могу это сделать, но я хочу понять, возможно ли зафиксировать исключения первого шанса. Я изменяю команду на ProcDump -ma -e 1 MyApplication.exe, которая также должна захватывать первый шанс, но по-прежнему не видит захваченного файла дампа.   -  person crazy novice    schedule 22.08.2014
comment
Вы запускаете приложение с подключенным отладчиком? Если это так, он сначала подхватит исключение, прежде чем ProcDump сможет его получить. Хотя, похоже, ты уже знаешь больше меня. Я не знал, что для ProcDump есть опция -e 1. :-)   -  person Cody Gray    schedule 22.08.2014
comment
нет, я не запускаю приложение под отладчиком   -  person crazy novice    schedule 22.08.2014


Ответы (1)


Вы не используете его правильно, он не стесняется сказать вам об этом. Измените свой код на:

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

В качестве альтернативы рассмотрите DebugDiag.

person Hans Passant    schedule 22.08.2014
comment
На самом деле у меня в коде был Console.ReadLine(), чтобы ProcDump мог найти процесс. Извините, я не должен был удалять эту строку из кода. - person crazy novice; 22.08.2014
comment
Нет, не надо было удалять. Это работало нормально, когда я тестировал это. procdump.exe -ma -e 1 консольное приложение1.exe. Переключитесь и нажмите Enter, бац, 48-мегабайтный файл .dmp. Чего еще мы не знаем? Что на самом деле показывает ProcDump? - person Hans Passant; 22.08.2014
comment
На самом деле моя ошибка, Console.ReadLine() была не в том месте. Ты человек :) - person crazy novice; 22.08.2014
comment
Кстати, относительно вашего предложения использовать DebugDiag, можно ли настроить его против процесса, который не запущен? - person crazy novice; 22.08.2014
comment
Чтобы ответить на последний вопрос @PaulSnow (и он запоздал на много лет, но, возможно, может помочь другим) - я не нашел способа сделать это в DebugDiag. По моему опыту, процесс должен быть запущен, пока вы создаете правило, чтобы вы могли его выбрать. После этого (если правило все еще активно) DebugDiag должен продолжать собирать аварийные дампы для будущих запусков. blogs.msdn.microsoft.com/kaushal/2012/05/09/ - person ErrCode; 16.11.2018