Поймать. NET ошибка, которая происходит только в выпуске, без исключений - PullRequest
4 голосов
/ 13 сентября 2010

В настоящее время я наблюдаю ошибку, которая происходит только в режиме «Release» моего exe.

Поэтому у меня нет подключенного отладчика, и приложение работает только "... перестало работать".

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

Это может быть связано с тем, что я интегрирую неуправляемый код, но даже тогда, почему он будет другим в режиме выпуска? Могу ли я поймать это исключение?

Я подозреваю, что это одна из тех ошибок, которые при запуске в отладчике приводят к "Не удается показать код трассировки / поиска стека" (и на самом деле не выдает исключение), но я, честно говоря, не могу это проверить. Предложения ТАК?

Ответы [ 6 ]

5 голосов
/ 13 сентября 2010

Вы все еще можете подключить к нему отладчик, даже если он работает в режиме выпуска. Вы можете попробовать что-то вроде ...

  • Напишите программу так, чтобы она ожидала нажатия клавиш в начале выполнения
  • Запустите его в режиме выпуска
  • Подключите отладчик, пока он ожидает нажатия клавиши
  • Отладка

Тогда посмотри, что происходит. Если это перестает происходить и работает под отладчиком даже при работе в режиме Release, у вас есть Heisenbug (в основном это означает, что будет очень трудно найти эту ошибку).

Если, однако, это происходит и отладчик Visual Studio ломается, когда возникает проблема, тогда посмотрите на окно Threads (я думаю, Ctrl + Alt + H). Возможно, что, хотя ваше приложение использует только один поток, собственный код, который вы запустили, может запускать собственные неуправляемые потоки. Если это так, вы можете найти способ заставить его прекратить это делать, поскольку, к сожалению, нет способа отловить это исключение в вашем управляемом коде.

1 голос
/ 05 июня 2018

Два цента здесь:

Недавно я столкнулся с проблемой в приложении winforms, в которой я получил бы исключение "ссылка на объект не установлена ​​на экземпляр объекта". Это происходило только в режиме выпуска, а не в режиме отладки.

Я смог запустить программу как релиз с ограниченной отладкой и мог видеть все переменные. Ни у кого из них не было проблем.

Во всяком случае, я буквально обновил Visual Studio с версии 15.7.1 до 15.7.3, и проблема исчезла.

1 голос
/ 13 сентября 2010

Это может быть связано с тем, что вы используете try catch блок где-то

Попробуйте следующие шаги

1 - Перейти к Visual Studio IDE

2- Выберите параметры отладки

3- Нажмите на исключения

4 - Проверить опцию Броска для следования «Общепринятое исключение RunTime» и исключение Native Win 32

5- Сначала запустите ваш код в режиме отладки.

6- Убедитесь, что вы получаете исключения или нет.

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

0 голосов
/ 13 сентября 2010

Я думаю, что лучше сначала тестировать неуправляемый код изолированно.

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

0 голосов
/ 13 сентября 2010

Вы можете пошагово отлаживать сборку Release от VS; попробуйте сначала.

Если смешивание управляемого и неуправляемого кода по какой-то причине усложняет задачу, вы можете попробовать использовать WinDbg с расширениями SOS и SOSEX. См. Мой ответ здесь для получения информации о необходимых основных шагах - и проверьте, что вы генерируете символы PDB для сборок Release.

0 голосов
/ 13 сентября 2010

Расположение памяти будет отличаться между Release и Debug. Также расположение стека может быть другим. Если у вас глючная часть неуправляемого кода, удаляющего память, он будет иметь случайные эффекты.

...