Отладка .NET EXE-файла, который сразу падает - PullRequest
5 голосов
/ 19 февраля 2010

Я работаю с управляемым EXE-файлом, который вылетает сразу при запуске. Обычно я ожидаю диалоговое окно, в котором можно запустить отладчик, но в этом случае не повезло. Кроме того, программа аварийно завершает работу, чтобы я мог использовать метод присоединения к процессу в Visual Studio.

Какое решение?

Ответы [ 5 ]

14 голосов
/ 19 февраля 2010

Если у вас установлено WinDbg , используйте меню Файл Открыть исполняемый файл , чтобы открыть приложение непосредственно в отладчике и автоматически прервать его немедленно.

Затем вы можете использовать команды в Debug (т.е. Go ) для его нормального выполнения и отладки. Также загрузите SOS Extensions . Не так хорошо, как Visual Studio, но полезно, если у вас есть только EXE (и, надеюсь, PDB, хотя это необязательно) и нет источника.

Пример : Это мой исходный код, который, как мы предполагаем, недоступен:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        int x = 10 - 10;
        int i = 2000/x;

        Application.Run(new Form1());
    }

Сбой сразу, без возможности вовремя подключить отладчик. Это вывод WinDbg после нажатия «Run»:

Удалена мертвая ссылка ImageShack - я нарисовал круги от руки

После загрузки SOS.dll вы можете использовать! DumpStack, чтобы увидеть, где было сгенерировано исключение:

Удалена мертвая ссылка ImageShack - Круги от руки не извините, извините!

Обратите внимание, что оптимизация JIT или компилятора может привести к встраиванию методов, что может сделать StackTrace не на 100% надежным, но для быстрого обзора это работает.

WinDbg немного загадочен, но как только вы освоите некоторые основы, это будет здорово и, по крайней мере, поможет найти корень проблемы.

3 голосов
/ 19 февраля 2010

Еще одна опция, не упомянутая выше, это вставить

Debugger.Break();

оператор в самом начале программы - возможно, обернутый в #ifdef DEBUG, чтобы упростить его пропуск при создании для выпуска. Я использовал эту технику для отладки сервисов Windows, которые вначале зависали.

2 голосов
/ 19 февраля 2010

Немедленный сбой?

Я бы использовал ildasm только для того, чтобы убедиться, что у меня есть корректный (выглядящий) управляемый исполняемый файл.

Кроме того, меня несколько раз укусилналичие .exe на сетевом диске и неверно установленные разрешения.

2 голосов
/ 19 февраля 2010

Одна из распространенных причин этого заключается в том, что исключение выдается в конструкторе того объекта, который создается при вызове Application.Run ... как в:

Application.Run(new MyForm());

Если конструктор MyForm создает исключение,обычно это просто сбой.

Также рассмотрите возможность использования Просмотр журнала привязки сборки , чтобы определить, отсутствует ли необходимая сборка или возникла проблема с контролем версий.

1 голос
/ 19 февраля 2010

Запустите его из отладчика ( F5 или Ctrl + Shift + B )Вы должны быть в состоянии установить произвольную точку останова (как в основной функции) и сделать шаг за шагом.

...