Могу ли я использовать map2dbg с 64-битными исполняемыми файлами Delphi? - PullRequest
4 голосов
/ 24 февраля 2012

В настоящее время я использую map2dbg для создания файла .dbg из моих файлов Delphi .map.Это прекрасно работает для 32-битных исполняемых файлов.Для 64-битных исполняемых файлов вызов map2dbg.exe кажется успешным, но результирующий файл .dbg не представляется полезным.Когда я просматриваю трассировки стека в Process Explorer, у них нет имен символов.

Стоит ли даже ожидать, что map2dbg будет работать в 64-битном режиме?И если нет, есть ли альтернатива, которую я могу использовать?

Ответы [ 5 ]

10 голосов
/ 07 декабря 2012

Я провел небольшое исследование, и кажется, что map2dbg действительно может использоваться для 64-битных исполняемых файлов, созданных в Delphi XE2.Единственное, что вам нужно, это изменить WORD в сгенерированном файле DBG со смещением 4 с $ 8664 до $ 014 C.

Да, это похоже на бессмыслицу, потому что это означает изменение поля Machine в заголовке DBG с AMD64 на X86., но это действительно приводит к корректной загрузке файла DBG как в WinDbg, так и в Process Explorer.

Я сделал исправленную версию map2dbg версии 1.3, поэтому он автоматически записывает $ 14c в DBG.Вот архив: http://yadi.sk/d/kbVFCGyI2gQzM

ОБНОВЛЕНИЕ: файлы DBG, созданные с исправленной версией map2dbg, принимаются как Process Explorer, так и WinDbg, а символы из этих DBG правильно связаны с соответствующими адресами в исполняемом файле., но отображаются неправильные кадры стека.

Причина в библиотеке DBGHELP.Как видно из его разборки, он загружает только файлы DBG, созданные для процессоров X86 или Alpha (значения машинного поля $ 14c и $ 184).Но если мы вручную изменим поле Machine в файле DBG с AMD64 на X86, то DBGHELP будет рассматривать исполняемый файл как 32-разрядный модуль (поэтому сегмент PDATA из исполняемого файла не будет использоваться при разматывании стека), и неверный стеккадры будут отображаться отладчиками.

Я исправил обе версии DBGHELP для x86 и x64, установленные с WinSDK для Win8.Исправленные версии позволяют загружать файлы DBG с полем AMD64 Machine ($ 8664), поэтому стеки кадров отображаются в соответствии с ожиданиями.Эти версии доступны в этом архиве: http://yadi.sk/d/7ZDLv2ed2gRGo

Итак, теперь у нас есть два разных подхода к использованию символов из 64-битных исполняемых файлов, скомпилированных с Delphi XE2:

  1. Простой способ: используйте пропатченную map2dbg для создания DBG "fake-x86", которые могут быть загружены в WinDbg и Process Explorer, так что адреса символов будут показаны, но отладчики не смогут отображать кадры стека.

  2. «Хардкорный» путь: используйте патченный dbghelp.dll, с поддержкой файлов AMD64 DBG.С этой версией DBGHELP WinDbg и Process Explorer могут разматывать кадры стека.

ONE MORE UPDATE: cv2pdb теперь может конвертировать файлы DBG, созданные с помощью map2dbg, в PDB,Поддерживаются как 32-битные, так и 64-битные исполняемые файлы.

Вот скомпилированная версия последних источников cv2pdb.

3 голосов
/ 24 февраля 2012

К сожалению, поддержка * .dbg устарела (примечание: даже не используется и не загружается!) В более новых версиях продуктов Microsoft (windbg, Process Explorer, Visual Studio и т. Д.). Поэтому, даже если он создает действительный файл .dbg, он никогда не будет использован ...: - (

Мое самое большое желание - создать файл .pdb! Так что, если кто-то может получить спецификации для этого ?! (это закрытый формат MS?) Еще хуже то, что новейший профилировщик Intel VTune / Threading также больше не использует файлы .dbg, поэтому я ДЕЙСТВИТЕЛЬНО ХОЧУ ХОТЯТЬ DELPHI ДЛЯ PDB CONVERTER! (извините за крик)

Я пробовал несколько вещей, но пока безуспешно. Вот почему я создал свой собственный просмотрщик стеков и мини-дамп, который использует символы отладки Delphi (.map, .jdbg и т. Д.): http://code.google.com/p/asmprofiler/wiki/ProcessStackViewer http://andremussche.blogspot.com/2011/03/minidump-reader-for-delphi.html

Примечание: я еще не тестировал свои вещи в 64-битных приложениях Delphi ... Так что, вероятно, это не сработает, но вы все равно можете попробовать ...

1 голос
/ 05 марта 2012

Только для вашей информации: я нашел писателя PDB https://github.com/jbevain/cecil/blob/master/symbols/pdb/Mono.Cecil.Pdb/PdbWriter.cs

Это часть библиотеки Mono Cecil (реализация с открытым исходным кодом .net). Я надеюсь, что он может быть изменен, чтобы читать файлы Delphi .map тоже ... (еще не проверено)

0 голосов
/ 20 марта 2012

Я сделал некоторые изменения (на самом деле прокомментировал исключения :-)) в tds2pdb.Теперь это также работает для файлов Delphi .tds, как 32-битных, так и 64-битных!См. Мой пост G +: https://plus.google.com/u/0/110131086673878874356/posts/eJBKC16e5f6

Примечание: только ProcesExlorer не показал полный стек моей 64-битной тестовой программы, ProcesHacker и WinDbg показывают полный стек.

0 голосов
/ 16 марта 2012

Просто для вашей информации, я сделал Proll of Concept dll для dbghelp.dll, поэтому он также может читать файлы Delphi .map. Это своего рода прокси dll: он имеет такой же экспорт реального dll, но все они перенаправлены в реальную / оригинальную DLL. 3 функции символа реализовано с помощью поиска Delphi (jclDebug.pas): https://plus.google.com/u/0/110131086673878874356/posts/4rmyQM5kVW7 https://plus.google.com/u/0/110131086673878874356/posts/TSJRqFJR3WZ

Пока только 32 бита. ProcesExplorer работает только в 64-битной в 64-битной Windows, но ProcesHacker также имеет 32-битную версию. Когда у меня будет больше времени, я могу улучшите это далее ... или попробуйте сами в это же время! В 64-битном режиме вы не может использовать «ASM JMP PToProc», но что-то вроде «ASM JMP qword ptr [rel p]».

...