Pull to refresh

Comments 4

Спасибо за статью.
А вы не разбирались как gdb догадывается как ему раскручивать стек по первому или второму методу?
У gdb свой метод — через отладочную информацию в формате DWARF. Я сильно глубоко не разбирался в структуре формата, но знаю, что он более широкий, чем приведенные в статье (т.е. тот же ARM.exidx можно получить из DWARF). То есть когда вы собираете elf файл с отладочной информацией, компилятор создает там секцию .debug_frame, в которой лежит информация в формате DWARF, предназначенная для раскрутки стека. Посмотреть на то как она выглядит можно через readelf --debug [file]

p.s.
Немного дополню: Два метода приведенные в статье — это методы трассировки стека в обычном режиме работы программы. Без подключения отладчика.
По поводу fast unwind для Thumb-инструкций, это проблема конкретно GCC, в clang всё починили и регистры сохраняются в два этапа.
Мы сделали такое же для GCC, чтобы заставить нормально работать Address Sanitizer для armv7l, однако ребята из ARM упёрлись, сказали, «clang is broken», и отказались принимать наш патч. Если нужен, можете его позаимствовать из мейллиста и положить на свой тулчейн.
Спасибо.
Я тоже находил эту багу в llvm когда разбирался с gcс, но вот Ваш патч тогда не нагуглился. Похоже ARM убрал фреймы в новом стандарте AAPCS. И насколько я понимаю, когда они переделывали APCS, то одним из аргументов отказаться от фреймов была производительность, поэтому они сейчас на такие патчи реагируют негативно. Ну и плюс для тех же Cortex-M, ARM активно внедрял аппаратную отладку и профилирование, те же ITM.

Патч может бы и взяли, но довольно сложно будет поддерживать свою версию компилятора.
Sign up to leave a comment.