Я только что прочиталЕсть ли переносимый/стандартный способ получения имен файлов и слоев в трассировке стека?
How to generate a stacktrace when my gcc C++ app crashes
который довольно старый теперь (5 лет). Некоторые ответы предлагают решения, позволяющие получить для каждого фрейма стека имя функции и смещение (в пределах стека, я думаю). Но мне действительно нужны (и могут другие) исходное имя файла и номер строки, где был сделан вызов (при условии, что код был скомпилирован с информацией об отладке). Один из ответов связан с частью glibc, которая делает это (libSegfault; см. Файлы в this directory - segfault.c
, backtracesyms.c
, backtracesymsfd.c
) - так что это возможно.
Мои вопросы:
- Может ли эта информация быть извлечена в независимой от платформы моды, или один, что соответствует некоторому стандарту (POSIX ??)
- Почему не libunwind поддерживает это? (I думаю это не, после просмотра ther website)
- Это обязательно зависит от стандартной библиотеки вашего компилятора C/C++ (по крайней мере, для приложений на C/C++)?
Примечания:
- Вы можете предполагать двоичный файл отладочной информации, так и в случае C/C++ он был скомпилирован с
-g
; конечно, в правильной библиотеке мы будем проверять, доступна ли информация об отладке или нет.
Нет; нет стандартного способа; ни стандарты языка C, ни C++, ни стандарт POSIX o/s не предусматривают способ сделать это. Libunwind, вероятно, настолько близок к тому, чтобы быть столь же портативным, как вы можете получить - может быть несколько других сопоставимых библиотек. И да, это зависит от платформы - o/s и компилятора. Трассировки стека в обработчиках сигналов могут быть ... интересными. –
@JonathanLeffler: Но, скажем, gdb не делает это на многих платформах? Даже для двоичных файлов, не скомпилированных с gcc? – einpoklum
Да, но GDB имеет сложный код, который зависит от платформы, чтобы сделать это. Пойдите и взгляните - это не будет тривиально. Он работает с ABI, определенным для платформы, и зависит от модели отладки (Dwarf vs ...) и формата объектного файла (и исполняемого файла) (ELF vs COFF vs ...) и т. Д. То, что работает на macOS, не будет работать в Windows, и ни одна из них не будет работать в Linux. Вот где вступают в игру библиотеки, такие как libunwind. –