Я разработал программу для клиента, который испытывает, когда он выполняет определенную операцию. Это не всегда происходит в одном и том же месте и на одних и тех же данных, и, более того, это не происходит ни на моей локальной разрабатывающей машине, ни на моей тестовой виртуальной машине (которая свободна от всего разрабатываемого оборудования).
Учитывая эти условия, я решил скомпилировать с MAP (включен в Настройка свойств-> Linker-> Отладчик с параметром / MAP), чтобы увидеть, какая функция вызывает сбой.
Если я правильно понял, при сбое программы я должен проверить ошибку смещения, а затем поискать в моей MAP под столбцом RVA + BASE:
Address Publics by Value Rva+Base Lib:Object
0001:00037af0 ?PersonalizzaPlancia@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00438af0 f DlgGestioneDatiProgetto.obj
0001:00038000 ?SalvaTemporanei@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00439000 f DlgGestioneDatiProgetto.obj
На самом деле мой сбой происходит по смещению:
00038C90
Поэтому я должен думать, что это где-то в методе:
MosaicoDialogs::CDlgGestioneDatiProgetto::PersonalizzaPlancia
но это не совсем возможно, поэтому, если предположить, что компьютер не ошибается, я тот, кто делает это плохо.
Может кто-нибудь объяснить мне, как правильно читать MAP?
Чтение MAP-файлов для определения места сбоя хорошо объясняется в этой статье проекта кода.
http://www.codeproject.com/Articles/3472/Finding-crash-information-using-the-MAP-file
Надежда помогает.
не беспокойтесь — вместо этого постройте проект с включенными символами и скопируйте их в файл pdb.
Немного измените программу, чтобы написать мини-дамп при сбое, используя необработанный обработчик исключений
Передайте клиенту только что скомпилированную программу, а в случае ее сбоя вызовите MiniDumpWriteDump.
Попросите клиента отправить вам этот файл .dmp, и вы просто загрузите его в Visual Studio (или WinDbg), и он сопоставит символы с программой, а также совпадет с кодом. Вы должны быть в состоянии увидеть точную строку кода и некоторые задействованные переменные. (при использовании VS, когда вы загружаете файл .dmp, в правом верхнем углу будет возможность «начать отладку», щелкните по нему, так как он «начнет отладку» в момент сбоя)
Попробуйте сначала локально — поместите ошибку div на ноль где-нибудь в вашей программе и посмотрите, сможете ли вы отладить дамп после его запуска. Обратите внимание, что вы должны сохранять один и тот же файл символов для каждой сборки вашей программы — они точно совпадают. Вы не можете ожидать, что файл символов для одной сборки будет соответствовать другой сборке, даже если ничего не изменилось.
Существуют учебные пособия для такого рода вещей, таких как этот из CodeProject похоже, это описывает то, что вам нужно.
Для посмертной отладки есть альтернатива, которая не требуется использование файла карты. Скорее, вам потребуется создать простой сценарий реестра, чтобы включить некоторые WER (Windows Error Reporting) флаги для перехвата файла аварийного дампа. Во-первых, создайте ваше приложение с отладочными символами. Затем следуйте инструкциям для Сбор дампов в пользовательском режиме. По сути, вы создаете вложенный ключ под ключом «LocalDumps». Этот подраздел должен быть именем вашего приложения, например, «myapplication.exe». Затем создайте ключи / значения «DumpCount», «DumpType» и «DumpFolder». Попросите пользователя запустить скрипт реестра. Это позволит отловить дамп локально. Затем попросите пользователя вызвать сбой, чтобы собрать файл дампа. Затем пользователь может отправить вам файл дампа для отладки, используя символы, которые вы создали ранее. Наконец, вам нужно создать скрипт реестра, который удаляет ключи / значения, которые вы добавили в реестр.