Помогите отладить отладку приложения Win32 в смешанном режиме - PullRequest
1 голос
/ 09 апреля 2009

Вот ситуация:

Фон

У меня есть смешанное приложение .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.

Возможно ли, что я каким-то образом повредил стек / кучу, из-за чего поток просто испортился ...?

Ответы [ 4 ]

3 голосов
/ 09 апреля 2009
1 голос
/ 09 апреля 2009

не могли бы вы опубликовать стек неисправного потока после того, как вы установили копию windbg и открыли там файл дампа? мы могли бы начать оттуда.

1 голос
/ 09 апреля 2009

У нас была проблема, похожая на эту, когда ошибка кода отсутствовала в MSVC2K5 SP1, но если у вас была установлена ​​среда выполнения MSVC2K5 SP2, это вызывало ошибку, которая не указывала на допустимый код.

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

Это произошло с нами, когда новая установка среды выполнения .Net установила более новую версию среды выполнения MSVC C ++ в каталог SxS.

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

0 голосов
/ 12 августа 2009

Ваш EIP был просто поврежден.
Предполагая, что ESP действителен, вы можете просмотреть стек вызовов, просто наберите:
ддс эсп [ввод]
ддс [введите]

Вы также можете использовать окна памяти:
Установить адрес: esp
Установить формат: указатель и символ

...