Получение полного пути от addr2line - PullRequest
2 голосов
/ 30 июля 2010

Я пытаюсь автоматизировать некоторые задачи отладки.В некоторых случаях я печатаю значение $ra [это машина MIPS] и части стека в виде шестнадцатеричных адресов.Во время отладки я использую addr2line для преобразования их в file:line пары.

Я хотел бы автоматизировать эту процедуру.

Проблема в том, что addr2line возвращает имя файла, эквивалентноезначение __FILE__ во время компиляции;т.е. имя файла, переданное компилятору.Обычно это foo.c, иногда src/foo.c.Поскольку в моем проекте всего несколько сотен каталогов, этого может быть недостаточно для однозначной идентификации файла (может быть 1/foo.c, 2/foo.c и т. Д.).Даже если бы он был детерминированным, кажется довольно неэффективным запускать поиск на моем экране для каждого аргумента [я полагаю, я мог бы создать хеш-таблицу и сохранить их, но я хотел бы сохранить это как простой скрипт bash]

GDB, похоже, получил нужный файл.Если я посмотрю на исходный файл с отладочными символами, я также увижу, что сразу после имени файла появляется полный путь к __FILE__ [то есть, если __FILE__ равен src/foo.c, и он действительно находится в /home/me/projects/something/comp1/src/foo.c, я увижу /home/me/projects/something/comp1 в файле.Как я могу получить это программно?

Спасибо.

1 Ответ

1 голос
/ 30 июля 2010

Это очень удивительное поведение. Я не могу воспроизвести это в:

  • Linux с gcc 4.1.2 и addr2line 2.17.50.0.6

  • Cygwin с gcc 4.3.4 и gcc 3.4.4 и addr2line 2.20.51.20100410

addr2line должен полагаться на отладочную информацию, хранящуюся в исполняемом файле. И отладочная информация должна содержать абсолютные пути (независимо от того, какой исходный путь был задан компилятору), чтобы избежать каких-либо двусмысленностей при использовании отладчика. Везде, где я пробую, addr2line всегда показывает абсолютный путь.

Предполагая, что вы используете make для своей системы сборки, одним из вариантов, хотя, возможно, и болезненным, было бы изменение ваших make-файлов для использования нерекурсивной стратегии (то, что вы действительно должны делать в любом случае). В такой системе выполняется только один экземпляр make из одного рабочего каталога (обычно это верхний уровень вашего исходного дерева). Поэтому все вызовы компилятора указывают полный путь к исходному файлу (относительно корня исходного дерева). Это решит вашу проблему, если, на самом деле, addr2line всегда показывает имена файлов так, как они были указаны для компилятора. Не лучшее решение, но оно будет работать. И как дополнительное преимущество, вы получите все преимущества нерекурсивного создания.

...