addr2line
Эта утилита Binutils может обрабатывать любой символьный адрес, включая переменные и имена функций.
По умолчанию он неинтерактивен, что полезно в некоторых случаях при вскрытии.
main.c:
#include <stdio.h>
int myvar;
int main(void) {
printf("myvar = %d\n", myvar);
}
Скомпилировать и разобрать:
gcc -O 0 -g gdb3 -o main -pedantic-errors -std=c89 -Wextra main.c
readelf -s tmp.out | grep -E ' (main|myvar)'
Дает:
55: 0000000000201014 4 OBJECT GLOBAL DEFAULT 24 myvar
65: 000000000000064a 32 FUNC GLOBAL DEFAULT 14 main
А теперь мы можем попробовать:
addr2line -e main 201014 64a
, что дает:
/full/path/to/main.c:3
/full/path/to/main.c:5