Хорошо ли создавать дамп памяти в клиентской среде?

Я столкнулся с серьезной проблемой с моей программой, которая воспроизводится только на месте клиента. Выкладывание логов не помогает, так как я сомневаюсь, что сбой происходит в сторонней dll. По некоторым причинам мне не удалось получить помощь от поставщика библиотеки. Я думаю сделать дамп на месте отказа, чтобы проанализировать его в автономном режиме. Это рекомендуемая практика? Или какие альтернативы?


person eeykay    schedule 23.05.2009    source источник


Ответы (5)


Да, это то, что каждая программа должна иметь и использовать как можно чаще.

Я предлагаю вам не использовать сторонние библиотеки. Вместо этого создайте свои собственные дампы. Это очень просто и прямолинейно. В основном вам нужно сделать следующее:

Вашей программе необходим доступ к файлу dbghelp.dll. Это dll для Windows, которая позволяет создавать удобочитаемые стеки вызовов и т. д. Отладчик использует эту dll для отображения данных в вашем процессе. Он также обрабатывает посмертную отладку, т.е. своего рода дампы. Эту dll можно безопасно распространять вместе с вашим программным обеспечением. Я предлагаю вам загрузить и установить средства отладки для Windows. Это даст вам доступ ко всем видам инструментов, а лучший инструмент WinDbg.exe и последняя версия dbghelp.dll также входят в этот дистрибутив.

В dbghelp.dll вы вызываете, например. MiniDumpWriteDump(), которая создаст файл дампа и более или менее все. Готово. Как только этот файл окажется у вас в руках, вы сможете начать его использовать. Либо в отладчике Visual Studio, который, вероятно, даже может быть связан с расширением файла .dmp, либо в WinDbg.

Теперь есть несколько вещей, о которых нужно подумать, пока вы этим занимаетесь. При проверке файлов дампа, подобных этому, вам необходимо создавать файлы .pdb при компиляции и компоновке исполняемого файла. В противном случае нет возможности сопоставить данные дампа с удобочитаемыми данными, например. чтобы получить хорошие стеки вызовов и значения переменных и т. д. Это также означает, что вы должны сохранить эти файлы .pdb. Вы должны иметь возможность точно сопоставить их с этим самым выпуском. Поскольку файлы дампа имеют отметку даты с отметкой даты исполняемого файла, отладчику нужны точные файлы pdb. Неважно, не изменился ли ваш код ни на йоту, если файлы .pdb принадлежат другому сеансу компиляции, вы пропали.

Я рекомендую каждому разработчику Windows win32 посетить сайт Олега Стародумова DebugInfo.com. Он содержит множество примеров и руководств, а также то, как вы можете настроить и настроить создание файла дампа. Конечно, существует множество способов исключить определенные данные, создать собственное отладочное сообщение для прикрепления к дампу и т. д.

Имейте в виду, что минидампы будут содержать очень ограниченную информацию о состоянии приложения во время исключения. Компромисс - небольшой файл (около 50-100 КБ в зависимости от ваших настроек). Но при желании вы можете создать полный дамп, который будет содержать состояние всего приложения, т.е. глобальные переменные и даже объекты ядра. Эти файлы могут быть ОГРОМНЫМИ и должны использоваться только в крайних случаях.

Если есть юридические аспекты, просто убедитесь, что ваши клиенты знают, что вы делаете. Держу пари, у вас уже есть контракт, по которому вы не должны раскрывать деловые секреты или другие юридические аспекты. Если клиенты жалуются, убедите их, насколько важно находить ошибки и что это резко улучшит качество программного обеспечения. Более или менее более высокое качество за ничто. Если им это ничего не стоит, то это тоже хороший аргумент :)

Наконец, вот еще один отличный сайт, если вы хотите узнать больше об анализе аварийных дампов: dumpanalysis.org.

Надеюсь это поможет. Пожалуйста, прокомментируйте, если вы хотите, чтобы я объяснил больше.

Ваше здоровье !

Редактировать:

Просто хотел добавить, что MiniDumpWriteDump() требует, чтобы у вас был указатель на структуру MINIDUMP-EXCEPTION-INFORMATION (с символами подчеркивания). Но макрос GetExceptionInformation() предоставляет вам это во время исключения в вашем обработчике исключений (структурированная обработка исключений или SEH):

__try {

}
__except (YourHandlerFunction(GetExceptionInformation())) {

}

YourHandlerFunction() будет заботиться о создании минидампа (или какой-либо другой функции в цепочке вызовов). Кроме того, если в вашей программе есть пользовательские ошибки, например. происходит то, что не должно происходить, но технически не является исключением, вы можете использовать RaiseException(), чтобы создать свое собственное исключение.

GetExceptionInformation() можно использовать только в этом контексте и нигде больше во время выполнения программы.

person ralphtheninja    schedule 23.05.2009

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

Просто убедитесь, что клиент/клиент понимает, что вы делаете, и что у вас есть разрешение. Возможно, что аварийный дамп может содержать конфиденциальную информацию, которую клиент может не захотеть (или ему будет разрешено) раскрывать за дверь или передавать по сети.

person Michael Burr    schedule 23.05.2009

Более того, есть библиотеки, которые будут загружать вам данные о сбоях.

BugDump и BugSplat

И есть способ Microsoft:

http://msdn.microsoft.com/en-us/library/aa936273.aspx

person SpliFF    schedule 23.05.2009

Отказ от ответственности: я не юрист и не претендую на таковое, это не юридическая консультация.

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

Правило HIPAA о конфиденциальности регулирует использование и раскрытие определенной информации, хранящейся у "защищенных лиц". (...) Он устанавливает правила использования и раскрытия защищенной медицинской информации (PHI). PHI – это любая информация, хранящаяся у субъекта, на которую распространяется страховая защита, которая касается состояния здоровья, оказания медицинских услуг или оплаты медицинских услуг, которая может быть связана с физическим лицом.[10] Это интерпретируется довольно широко и включает в себя любую часть медицинской карты человека или истории платежей. --Википедия

Не должно быть возможности связать информацию о состоянии здоровья с отдельным лицом. Аварийные дампы и журналы должны быть анонимизированы и лишены какой-либо конфиденциальной информации или вообще не отправляться.

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

person FeatureCreep    schedule 23.05.2009

По сути, самый простой способ создать файл дампа — использовать adplus. Вам не нужно менять свой код.

Adplus является частью инструментов отладки для Windows, как упоминалось в статье выше. Adplus — это, по сути, огромная автоматизация vbscript для windbg.

Что нужно сделать, чтобы использовать adplus:

  1. Загрузите и установите средства отладки для Windows в папку c:\debuggers.
  2. запустите ваше приложение
  3. откройте командную строку и перейдите в c:\debuggers
  4. запустите эту строку «adplus -crash your_exe.exe»
  5. воспроизвести сбой

вы получите мини-дамп со всей необходимой информацией. вы можете открыть аварийный дамп в своем любимом отладчике. В Windbg команда «analyze -v» помогла мне, по крайней мере, в 40% всех сбоев, которые происходили только на стороне клиента и не воспроизводились в домашних условиях.

person primeMover    schedule 26.05.2009