Как проанализировать аварийный дамп из двоичного файла, созданного с включенной оптимизацией (режим выпуска)? - PullRequest
3 голосов
/ 22 июня 2011

До сих пор я использовал двоичные файлы режима отладки в проекте. Поэтому было легко проанализировать аварийный дамп с использованием сохраненных файлов символов.

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

  1. Возможно ли это вообще?
  2. Как определить функции в режиме выпуска? (Нужно создать и сохранить файл карты)

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Вам необходим файл .pdb, соответствующий исполняемому файлу. Это даст вам символы.

Есть несколько хитрых моментов при отладке сборки релиза:

  1. Порядок операций может быть отключен из-за оптимизаций
  2. Целые функции / переменные / и т. Д. может быть оптимизирован прочь
  3. В частности, аргументы, передаваемые в функции, могут не существовать (например, «this» может быть регистром, а не местом в памяти). Windbg довольно хорошо справляется с этой задачей, включая определение аргументов.
2 голосов
/ 22 июня 2011

Нет необходимости иметь файлы MAP. Вам необходимо включить флаг «Создать информацию отладки» /DEBUG, даже для сборки выпуска. На VS2008 и выше флаг /DEBUG установлен даже для сборок Release. В более ранних версиях вам нужно явно сделать это.

При этом будут созданы файлы .PDB для вашего .EXE / .DLL, и вы должны хранить их вместе с исполняемыми файлами / DLLS (вы можете или не можете давать клиентам, это ваш выбор). Когда происходит аварийный дамп, вы должны иметь / получить файл .DMP. Просто загрузите этот файл DMP в Visual Studio из того места, где вы сохранили файлы PDB. Это покажет стек вызовов, где произошел сбой.

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

Используя это, вы можете увидеть правильный стек вызовов для ВСЕХ работающих потоков. Но вам также понадобится правильная копия исходного кода , чтобы увидеть код! В противном случае это будет просто сборка. Частичный исходный код MFC / ATL / STL и т. Д. Может быть виден, но не ваш код, если только у вас нет правильного исходного кода.

Файлы PDB хранят путь к исходному коду, и они позволяют отладчику загружать исходные файлы, даже если источник находится не в том месте, где вы разместили PDB и файл DMP.

...