Вопрос

Я разработал программу клиента, который испытывает, когда он делает определенную операцию.Это не происходит всегда на одном и том же месте и на одних и тех же данных, и, кроме того, это не происходит ни в моей местной разработке машины, ни на моем тесте виртуальной машины (которая свободна от всего разрабатываемого оборудования).

Учитывая эти условия, я решил скомпилировать карту (включена в настройке свойств-> Linker-> отладчика с опцией / картой), чтобы увидеть, какая функция вызывает сбой.

Если я правильно понял, когда программа сбой я, чтобы проверить ошибку смещения, а затем, поиск на моей карте под столбцом RVA + основание:

     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, чтобы узнать место схожи. Красиво объясняется в этой статье проекта кода.

http://www.codeProject.COM / Статьи / 3472 / Нахождение-сбоя - Информация - Использование-Map-File

Надежда помогает.

Другие советы

Не беспокоиться - вместо этого создайте проект с включенными символами и разделите их в файл PDB.

Измените программу немного, написать мини-вамс, когда он сбивает сбои с использованием Необработанный обработчик исключения

Дайте вновь собранную программу клиенту, и когда она сбивает вызов minidumpwritedump.

Попросите клиента отправить вам этот файл .dmp, и вы просто загрузите его в Visual Studio (или WINDBG), и он будет сопоставить символы к программе, и также будет соответствовать коду. Вы должны быть в состоянии увидеть точную линию кода и некоторые из вовлеченных переменных. (При использовании VS, при загрузке файла .dmp, верхний правый угол будет вариантом «начать отладку», нажмите «Как он» начнет «отладки» в точке аварии)

Попробуйте сначала локально - поставьте div на нулевую ошибку где-то в вашей программе и посмотрим, сможете ли вы отлаживать дамп после его выполнения. Обратите внимание, что вы должны сохранить тот же файл символа для каждой сборки вашей программы - они точно совпадают. Вы не можете ожидать, что файл символа для одной сборки, чтобы соответствовать другой сборке, даже если ничего не изменится.

Есть учебники для такого рода вещей, например, как это Из CodeProject , похоже, он описывает то, что вам нужно.

Для отладки постмертема есть альтернатива, которая будет не требует использования файла карты. Скорее, потребуется вам создать простой сценарий реестра для включения некоторых Флаги отчеты об ошибках Windows (Reporting Windows) для ловушки файла свалки. Сначала создайте свое приложение с помощью символов отладки. Затем следуйте инструкциям для Сбор Дампы пользовательского режима . По сути, вы создаете подпровку под ключ «LocalDumps». Этот дополнительный ключ должен быть названием вашего приложения, например, «MyApplication.exe». Затем создайте клавиши / значения «DUMPCOUNT», «DUMPTYPE» и «DUMP) и« DUMP). У пользователя запустите скрипт реестра. Это позволит ловить свалку локально. Затем пользователь принудил сбой, чтобы собрать файл дампа. Затем пользователь может отправить файл dump для отладки, используя символы, которые вы создали ранее. Наконец, вам нужно будет создать скрипт реестра, который удаляет ключи / значения, которые вы добавили в реестр.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top