Отладьте EXE-файл.NET, который сразу отказывает

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

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

5
задан Peter Mortensen 12 February 2013 в 17:18
поделиться

5 ответов

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

Затем вы можете использовать команды из раздела Debug (т.е. Go ), чтобы выполнить его в обычном режиме и отладить. Также загрузите расширения SOS . Не так хорошо, как 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 после нажатия кнопки «Выполнить»:

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

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

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

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

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

14
ответ дан 18 December 2019 в 07:08
поделиться

Еще один не упомянутый выше вариант - вставить

Debugger.Break();

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

3
ответ дан 18 December 2019 в 07:08
поделиться

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

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

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

2
ответ дан 18 December 2019 в 07:08
поделиться

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

1
ответ дан 18 December 2019 в 07:08
поделиться

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

Application.Run(new MyForm());

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

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

2
ответ дан 18 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: