Вот ситуация:
Фон
У меня есть смешанное приложение .NET / Native, разработанное в Visual Studio 2008.
Что я имею в виду под смешанным режимом, так это то, что интерфейс написан на C ++ .NET, который вызывает собственную библиотеку C ++. Нативный код выполняет основную часть работы в приложении, включая запуск новых потоков по мере необходимости. Код .NET предназначен только для пользовательского интерфейса (выигрышные формы).
У меня есть выпущенная сборка приложения, работающего на компьютере тестера.
Собственные библиотеки были скомпилированы с полной оптимизацией, но также с включенной отладкой («Формат информации отладки» был установлен на «База данных программы»).
Это означает, что у меня есть символы отладки для приложения в файле PDB.
Проблема
Так или иначе, у одного из тестеров возникла проблема с приложением, из-за которого оно иногда зависало на XP. Мне удалось получить мини-дамп аварии, используя доктора Уотсона за несколько прогонов.
Когда я отлаживаю в нем (используя мини-дамп - на самом деле я не отлаживаю реальное приложение), все символы отладки загружаются правильно: я могу видеть полную трассировку стека всех собственных потоков правильно. Другие потоки (предположительно потоки .NET) не имеют трассировки стека, но все они, по крайней мере, показывают мне, с какого потока был запущен dll (т.е. ntdll.dll).
Он правильно сообщает о потоке, который завершается с ошибкой («Необработанное исключение в 0x0563d652 в пользователе (5) .dmp: 0xC0000005: Место чтения нарушения доступа 0x00000000).
Однако, когда я захожу в ветку, ничего полезного не показывает. В трассировке стека есть одна запись с адресом памяти «0563d652 ()» (даже не «ntldll.dll»).
Когда я вхожу в разборку, он просто показывает случайный раздел из примерно 30 инструкций. Любая сторона адреса памяти просто "???". Похоже, он не является частью моего исходного кода (не загружен ли ваш двоичный файл последовательно в память? Нормально ли иметь случайный набор операторов сборки посреди ниоткуда?).
Мои вопросы
Так что в основном мои вопросы трехсторонние.
1) Может кто-нибудь объяснить отсутствие информации отладчику?
2) С учетом того, что я не могу показать ошибку, произошедшую в моем коде, может кто-нибудь подсказать причину сбоя
3) Могу ли я сделать что-нибудь еще, чтобы помочь мне диагностировать эту текущую проблему в будущем?
Помощь!
John
Обновление:
Вот дамп стека для сбойного потока из WinDBG
# ChildEBP RetAddr
WARNING: Frame IP not in any known module. Following frames may be wrong.
00 099bf414 02d0e7fc 0x563d652
01 00000000 00000000 0x2d0e7fc
Странно, да? Даже не показывает DLL.
Возможно ли, что я каким-то образом повредил стек / кучу, из-за чего поток просто испортился ...?