Что может вызвать аварийное завершение программы?

Приложение MFC (использующее SQLite3.dll для доступа к БД вместе с другими DLL для доступа к оборудованию) аварийно завершает работу. Определенной последовательности завершения нет :( Мое приложение представляет собой

  1. Однопоточное приложение
  2. Использует обработку исключений
  3. Использует более 6 DLL для доступа к различному оборудованию
  4. Работает на WinXP SP2

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

Заранее спасибо


person Jaganlal    schedule 17.12.2009    source источник
comment
Пробовали запускать через отладчик?   -  person Daniel A. White    schedule 18.12.2009
comment
Можете ли вы запустить программу в отладчике и предоставить трассировку стека сбоя и/или текст из окна вывода Visual Studio? Также попробуйте выполнить сборку в режиме отладки и посмотрите, получите ли вы какие-либо утверждения.   -  person Igor Zevaka    schedule 18.12.2009
comment
... или, по крайней мере, исполняемый код.   -  person Jim L    schedule 18.12.2009
comment
да, я пытался воссоздать его в режиме отладки, похоже, он не завершается ненормально. только в режиме выпуска это происходит.   -  person Jaganlal    schedule 18.12.2009
comment
Вы также можете попробовать добавить символы отладки в сборку релиза. Это все равно должно воспроизвести сбой, но, надеюсь, вы сможете получить трассировку стека, когда это произойдет.   -  person Phil Booth    schedule 18.12.2009


Ответы (2)


Вообще говоря, общие причины сбоев возникают, когда вы:

  • читать память, которая не твоя
  • записать память, которая не твоя
  • делить на ноль
  • сделать что-то внутри прерывания, что вы не должны
  • free() указатель более одного раза

Возможно также:

  • иметь необработанное исключение
  • нашел ошибку в вашем MFC
  • одна из ваших >6 библиотек DLL с аппаратным доступом выполняет любое из вышеперечисленных действий.
  • Вы столкнулись с какой-то аппаратной ошибкой

Возможно, вы передаете неверный буфер в одну из ваших аппаратных DLL, или забыли заблокировать часть памяти, или у вас даже может быть несоответствие версии между DLL и их заголовками.

Есть так много вариантов :P

person Seth    schedule 17.12.2009

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

person Thomas Matthews    schedule 18.12.2009