Отладка выпуска на клиентской машине

У нас есть собственный С++ Win32.exe, созданный с использованием Visual Studio 2005, который работает безупречно на всех машинах, которые мы тестировали внутри (XP 32-bit, Vista 32-bit и Windows 7 64-bit). Но, конечно, он несколько раз сработает на клиентской 32-разрядной машине Vista.

Копаясь на нескольких веб-сайтах, я нашел лакомые кусочки, которые указывают, отправляю ли я файлы PDB (vc80.pdb и projectName.pdb) вместе со сборкой выпуска исполняемого файла клиенту, есть способ генерации мини-дисков при сбое имеет место. Затем я могу загрузить аварийный дамп в Visual Studio и получить трассировку стека и другую полезную информацию. Утилита Microsoft Dr. Watson также, похоже, участвует в этом процессе.

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

  • какие файлы необходимо отправить?
  • Как получить аварийный дамп, который будет сгенерирован?
  • и как загрузить это в VS?

Кто-нибудь может описать этот процесс?

Ответы

Ответ 1

Мы можем получить аварийные дампы из нашей версии выпуска в полевых условиях и не должны отправлять файлы pdb с нашим продуктом.

Мы создаем вызовы для создания файла дампа сбоя сами в нашем обработчике исключений верхнего уровня, используя MiniDumpWriteDump(). Но даже без этого вы могли бы заставить пользователя генерировать файл сбоя в момент сбоя, используя диспетчер задач, который я верю, как упоминалось здесь: MSDN Инструкции для создания дампа файл.

После того, как у вас есть файл дампа, клиент застегивает его почтой и отправляет его вам, а вы бросаете его на Visual Studio. В VS вы выбираете Debug Mixed или Debug Native и использует локальную копию pdb для отображения стека вызовов и т.д.

Example from a dump I just created from a MS process

Ответ 2

Процесс, который должен выглядеть так:

  • Скомпилируйте исполняемый файл и создайте файл PDB. Убедитесь, что вы не вносите никаких изменений в код, используемый для исполняемого файла, или сохраняете резервную копию.
  • Отправлять исполняемый файл клиенту. Не нужно отправлять PDB файл. Единственная причина, по которой это нужно сделать, - это отладка на клиентской машине или использование таких инструментов, как Process Explorer, чтобы получить трассировку стека с именами функций в какой-то момент. Ни один из них не применим в вашем случае.
  • Если это компьютер XP/2003, используйте drwtsn32 для настройки создания дампа сбоя. Если Vista/7/2008, drwtsn32 удаляется, и вы должны настроить WER вместо. Другой вариант - использовать ADPlus для запуска приложения.
  • Как только произойдет сбой, дамп возвращается к вам и загрузите его в Visual Studio. У вас должен быть тот же самый код, исполняемый файл и PDB под рукой, чтобы отлаживать плавно.

Примечание:

  • WinDbg полезен для отладки производственной среды. Это очень сильный отладчик и он переносимый, но если вы привыкли к VS, вам будет удобнее использовать его.
  • Если вы создаете мини-накопитель, вы получите трассировки стека и некоторые значения переменных. Если вы создадите полный дамп, вы получите полную кучу, включая все переменные, - и гораздо больший файл дампа... Если передача не является проблемой, используйте полные дампы.
  • Если вы зарегистрировались в Microsoft, у вас может быть доступ к дампам, созданным при сбое вашей программы на сайтах клиентов. Это раздражает "Отправить информацию Microsoft"? окно, которое вы получите, когда произойдет сбой процесса, который отправит дамп в MS, и у вас будет доступ к нему...

Ответ 3

Я чувствую твою боль. Пришлось сделать это некоторое время назад.

В любом случае, вы пробовали Google Breakpad?

Breakpad - это библиотека и набор инструментов, который позволяет вам распространять приложение для пользователей с предоставленной компилятором отладочной информацией удаляются, записываются сбои в компактных файлах "minidump", отправляются обратно ваш сервер, и производят следы стека C и С++ из этих мини-дисков. Breakpad также может записывать мини-копии по запросу для программ, которые не разбился.

В настоящее время брейд-панель используется Google Chrome, Firefox, Google Picasa, Camino, Google Earth и другие проекты

Вы можете найти его здесь: http://code.google.com/p/google-breakpad/

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

Ответ 4

Я написал 2 статьи о DDj об отладке post mortem, которые могут вам помочь:

Посмертная отладка http://drdobbs.com/tools/185300443

и Повторная отладка после Mortem http://drdobbs.com/architecture-and-design/227900186

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

Ответ 5

Я сделал это некоторое время назад, и я думаю, что я последовал за этим руководством. Если это не сработает, проверьте утилиту Windbg, я помню, вам не нужно ее устанавливать, просто скопируйте и запустите, даже с USB-накопителя

Ответ 6

Если ваш клиент использует Vista SP1 или выше, вы можете настроить систему на создание локального файла дампа при каждом сбое приложения. Вы можете найти полную документацию на сайте MSDN.

Вы можете сохранить все свои PDB частным. Это необходимо только при фактическом анализе файла дампа. Если вы хотите отслеживать PDB, соответствующие версиям продукта, который вы отправляете, вам следует настоятельно рассмотреть использование сервера символов.