Как G CC печатает трассировку стека? - PullRequest
0 голосов
/ 07 мая 2020

когда gcc / g ++ обнаруживает ICE (внутреннюю ошибку компилятора), последние версии компилятора будут печатать аккуратную трассировку стека перед выходом.

Вопросы: Какая технология используется для этого? G CC написан на C ++, например, в некоторых консервативных версиях, таких как C ++ 03.

В частности,

  • G CC не использует Boost.

  • G CC не использует внешние библиотеки, такие как linunwind или lib, кроме насколько мне известно.

  • G CC не обязательно использует glib c. Например, я могу кросс-компилировать G CC на linux для хоста mingw32, и трассировки стека работают нормально.


Поэтому, прежде чем закрывать этот вопрос вслепую, сделайте уверен, что связанный ответ не нуждается ни в одной из этих библиотек.

1 Ответ

1 голос
/ 17 мая 2020

Как многие люди упоминали в комментариях, G CC статически ссылается на libbacktrace, который использует libgcc на платформах ELF (например, Linux) и пользовательский код на AIX и Windows. Предполагая, что большинство людей заинтересуются Linux, я расширяю тот, что ниже.

G CC библиотека времени выполнения (libgcc) содержит код разматывания стека, который используется для исключений C ++ и сообщений об ошибках . В частности, он используется Glib c ( backtrace (3) ), AddressSanitizer и самим G CC.

Внутренняя реализация раскрутки сильно зависит от цели. Например, на amd64 он использует метаданные макета стека, хранящиеся в разделах .eh_frame (см. https://uclibc.org/docs/psABI-x86_64.pdf), на ARM он также использует метаданные (но в другом формате), а на i386 он вручную анализирует пролог функции инструкции (для специфичных для платформы c подробностей можно изучить соответствующие файлы раскрутки в https://github.com/gcc-mirror/gcc/tree/master/libgcc).

...