Моя цель:
- Учитывая приостановленный поток в 32- или 64-разрядной программе Windows, скомпилированной с помощью Delphi, пройти по стеку (выполнимо)
- Учитывая записи стека, для перечисления локальных переменных в каждом методе и их значений. То есть, по крайней мере, найти их адрес и тип (integer32 / 64 / signed / unsigned, string, float, record, class ...), комбинацию которых можно использовать для поиска их значения.
Первое - это нормально, и этот вопрос касается второго. На высоком уровне, как вы перечисляете локальные переменные с учетом записи в стеке в Delphi?
На низком уровне я исследовал вот что:
RTTI: не перечисляет такую информацию о методах. Я никогда не думал, что это реальный вариант, но все равно перечисляю его здесь.
Отладочная информация: загрузка отладочной информации, созданной для отладочной сборки.
- Файлы карты: даже файл подробной карты (файл текстового формата! Откройте его и посмотрите) не содержит информации о локальных переменных. По сути, это список адресов и номеров строк исходного файла. Отлично подходит для обращения к файлу и корреляции строк, например, синие точки в желобе; не очень подходит для более подробной информации
- Информация об удаленной отладке (файл RSM) - неизвестная информация о его содержимом или формате.
- Файлы TD32 / TDS: мое текущее направление исследований. Они содержат глобальные и локальные символы и много другой информации.
Вот проблемы, с которыми я сталкиваюсь здесь:
- Документации по формату файлов TD32 (которую я могу найти) нет.
- Большая часть моих знаний о них получена из кода Jedi JCL, использующего их (JclTD32.pas), и я не уверен, как использовать этот код, и достаточно ли обширны структуры, чтобы отображать локальные вары. Я почти уверен, что он будет обрабатывать глобальные символы, но я очень не уверен в локальных. Существует большое количество определенных констант и без документации по формату, чтобы прочитать, что они означают, я остаюсь гадать. Однако эти константы и их имена должны откуда-то взяться.
- Источник, который я могу найти с помощью информации TDS , не загружает и не обрабатывает локальные символы.
Если это правильный подход, тогда возникает вопрос: «Есть ли документация для формата файла TDS / TD32 и есть ли какие-либо образцы кода, которые загружают локальные переменные?»
Образец кода не обязателен, но может быть очень полезен, даже если он минимален.
Ответы:
Проверьте, не были ли какие-либо символы отладки в двоичном формате. Также возможно использование GDB (в Windows его порт). Было бы здорово, если бы вы нашли файл .dbg или .dSYM. Они содержат исходный код, например.
Если у вас нет файлов отладки, вы можете попробовать получить MinGW или Cygwin и использовать nm (1) ( страница руководства ). Он будет читать имена символов из двоичного файла. Они могут содержать несколько типов, например, C ++:
Не забудьте добавить
--demangle
опцию, иначе вы получите что-то вроде:вместо того:
источник
strings
. Он будет извлекать строки из любого двоичного файла. См. Страницу руководства . Это напечатает строки, которые могут, но не должны быть полезныВзгляните на http://download.xskernel.org/docs/file%20formats/omf/borland.txt Справочник по открытой архитектуре. Он старый, но, возможно, вы найдете соответствующую информацию о формате файла.
источник