Подтвердить что ты не робот

Windows/С++: возможно ли найти строку кода, в которой было выбрано исключение, с "Смещение исключения",

Один из наших пользователей имеет исключение при запуске нашего продукта. Она отправила нам следующее сообщение об ошибке из Windows:

  Problem Event Name:                        APPCRASH
  Application Name:                          program.exe
  Application Version:                       1.0.0.1
  Application Timestamp:                     4ba62004
  Fault Module Name:                         agcutils.dll
  Fault Module Version:                      1.0.0.1
  Fault Module Timestamp:                    48dbd973
  Exception Code:                            c0000005
  Exception Offset:                          000038d7
  OS Version:                                6.0.6002.2.2.0.768.2
  Locale ID:                                 1033
  Additional Information 1:                  381d
  Additional Information 2:                  fdf78cd6110fd6ff90e9fff3d6ab377d
  Additional Information 3:                  b2df
  Additional Information 4:                  a3da65b92a4f9b2faa205d199b0aa9ef

Возможно ли найти точное место в исходном коде, где произошло исключение, имеющее эту информацию?

Какова общая методика для программистов на С++ в Windows для определения места ошибки, которая произошла на компьютере пользователя?

Наш проект скомпилирован с конфигурацией Release, создается файл PDB.

Надеюсь, мой вопрос не слишком наивен.

4b9b3361

Ответ 1

Да, это возможно. Начните отладку с тех же самых двоичных файлов, что и ваш пользователь, убедитесь, что DLL загружена, и у вас есть соответствующий файл PDB. Посмотрите в Debug + Windows + Modules для базового адреса DLL. Добавьте смещение. Отладка + Windows + Разборка и введите расчетный адрес в поле Адрес (префикс с 0x). Это показывает вам точную инструкцию машинного кода, которая вызвала исключение. Щелкните правой кнопкой мыши + перейти в исходный код, чтобы увидеть соответствующую строку исходного кода.

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

Вам нужен мини-насос. Вы можете легко получить его от своего пользователя, если она запускает Vista или Win7. Запустите TaskMgr.exe, вкладка "Процессы", выберите запущенную программу, пока она все еще отображает диалог сбоя. Щелкните его правой кнопкой мыши и создайте файл дампа.

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

Ответ 2

Если у вас есть мини-накопитель, откройте его в Visual Studio, установите MODPATH в соответствующие папки с исходными двоичными файлами и PDB и скажите "запустить". Вам также может потребоваться указать, чтобы он загружал символы с серверов символов Microsoft. Он отобразит стек вызовов в месте ошибки. Если вы попытаетесь посмотреть исходный код для определенного местоположения стека, он может спросить вас, где находится источник; если это так, выберите соответствующую исходную папку. MODPATH задается в свойствах командной строки отладки для "проекта", который имеет имя файла minidump.

Ответ 3

Информация о исходном коде не сохраняется в скомпилированном С++-коде, в отличие от языков метаданных, основанных на времени выполнения (например,.NET или Java). PDB файл представляет собой индекс символа, который может помочь скомпилировать код отладчика обратно в исходный код, но он должен выполняться во время выполнения программы, а не из дампа сбоя. Даже с PDB, скомпилированный код может подвергаться ряду оптимизаций, которые могут препятствовать отладчику идентифицировать исходный код.

Отладочные проблемы, которые проявляются только на машинах конечных пользователей, обычно являются вопросом тщательного ведения журнала и много подробного времени и усилий, расчесывающих источник. В зависимости от ваших взаимоотношений с пользователем (например, если вы являетесь внутренней корпоративной ИТ-разработкой), вы можете сделать образ виртуальной машины пользовательской машины и использовать ее для отладки, что может помочь значительно ускорить процесс реплицирование установленного программного обеспечения и стандартных запущенных процессов на рабочей станции пользователя.

Ответ 4

Я знаю, что эта тема очень старая, но это был лучший ответ Google, поэтому я хотел добавить свои $.02.

Хотя мини-дамп наиболее полезен, если вы скомпилировали свой код с включенными символами (просто отправьте файл без .pdb и сохраните .pdb!), вы можете посмотреть, какую строку это использует Отладчик MSVC или отладчик Windows. Статья в MSN:

http://blogs.msdn.com/b/danielvl/archive/2010/03/03/getting-the-line-number-for-a-faulting-application-error.aspx