Я пытаюсь использовать gdb в посмертном режиме с дампом ядра сбойного процесса. Я могу получить трассировку стека, но вместо того, чтобы показывать мне фактическое местоположение в функции-нарушителе, gdb показывает номер строки двухстрочной встроенной функции, которую вызывает функция-нарушитель.
gdb
Встроенная функция вызывается во многих местах; Как я могу найти, какой вызов вызвал сбой? Как мне сразу найти код вокруг встроенной функции?
Я предполагаю, что «много-много вызовов встроенной функции» происходят из одной «функции-нарушителя» (иначе ваш вопрос для меня не имеет смысла).
Лучше всего записать IP-адрес точки сбоя в GDB, затем использовать "objdump -dS ./a.out" и найти этот IP в выходных данных.
GDB
"objdump -dS ./a.out"
Перейти к рассматриваемому фрейму стека, распечатать точку инструкции (например, p $ rip), затем используйте его, чтобы найти вручную, например, "addr2line -e -i 0x84564756".
Это не масштабируется, но, по крайней мере, работает.
Вы можете попробовать установить OPTIMIZE в NO (например, setenv OPTIMIZE NO) и пересобрать проект: это говорит компилятору не оптимизировать код, следовательно, он может не выполнять встроенные вызовы функций.