Получить исходный номер строки из файла карты для DLL - PullRequest
2 голосов
/ 17 февраля 2011

Когда EXE-файл вызывает сообщение об исключении, например «нарушение доступа по адресу XXXXXXXX ...», адрес XXXXXXXX является шестнадцатеричным значением, и мы можем получить номер строки исходного кода, вызвавшего исключение, просмотрев файл карты.,Подробности ниже ( от madshi в EE ):

вам нужно вычесть базу изображения, которая, скорее всего, составляет 400000 долларов.Кроме того, вам необходимо вычесть адрес «базы кода», который хранится в заголовках изображений и каждого модуля (exe / dll).Обычно это 1000 долларов.Вы можете проверить, какое значение он имеет, используя бесплатный инструмент "PEProwse Pro".Это поле «База кода» в «Подробности» в «Необязательный заголовок».Вы также найдете там базовый адрес изображения.

Мой вопрос : Как получить номер строки источника для DLL ?Применяется ли такой же расчет?Спасибо!

Примечание 1: файл карты создан Delphi, и я не уверен, имеет ли это значение.

Примечание 2: Я использовал JCL DEBUG, но он не смог пойматьисключение, которое возникает при запуске DLL (на самом деле надстройка Office).

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Применяются те же вычисления, с учетом следующего замечания: вместо базового адреса изображения EXE вам нужно взять фактический адрес, куда была загружена DLL. База кода для DLL должна приниматься так же, как и для EXE (хранится в PE IMAGE_OPTIONAL_HEADER).

Кстати, EXE и DLL на самом деле одно и то же с точки зрения формата PE.

1 голос
/ 18 февраля 2011

Два двоичных файла не могут быть загружены по одному адресу.Таким образом, базовый адрес изображения, хранящийся в DLL / EXE, является лишь предложением, для которого оптимизирован двоичный файл.То, где двоичный файл действительно загружается в память, зависит от многих факторов, таких как другие двоичные файлы, загружаемые в процессе в первую очередь, версия Windows, внедренные сторонние библиотеки DLL и т. Д.

Как и предполагалось, вы можете использовать отладчик или инструмент, такой как ProcessПроводник, чтобы узнать, по какому адресу загружена DLL в это время.Или, если вы хотите узнать из кода, вы можете получить HInstance или HModule из DLL , так как оба они совпадают и являются адресом в памяти, в которую загружена DLL.Delphi получает HModule для других DLL через метод GetModuleHandle.В более новых версиях Delphi также есть другие методы поиска HInstance.

...