将调试符号转换为文件和行号

时间:2016-06-20 20:16:27

标签: debugging stack-trace debug-symbols strace systemtap

我正在使用strace和SystemTap来获取系统调用时的堆栈跟踪。我目前得到的是功能名称,但不显示文件名和行号。使用ls选项-k > /usr/lib64/libc-2.22.so(_IO_file_close+0xb) [0x7890b] > /usr/lib64/libc-2.22.so(_IO_file_close_it+0x120) [0x79f40] > /usr/lib64/libc-2.22.so(fclose+0x183) [0x6db93] > /code/coreutils/src/ls(close_stream+0x1a) [0x1232a] > /code/coreutils/src/ls(close_stdout+0x12) [0x9d52] > /usr/lib64/libc-2.22.so(__run_exit_handlers+0xe8) [0x39658] > /usr/lib64/libc-2.22.so(exit+0x15) [0x396a5] > /usr/lib64/libc-2.22.so(__libc_start_main+0xf7) [0x20587] > /code/coreutils/src/ls(_start+0x29) [0x4629] 的跟踪跟踪:

ls

又来自strace.stp的SystemTap中的另一个,示例中略微修改了 0x7f17e06eb607 : munmap+0x7/0x30 [/usr/lib64/libc-2.17.so] 0x7f17e0672882 : _IO_setb+0x62/0x70 [/usr/lib64/libc-2.17.so] 0x7f17e0671030 : _IO_file_close_it@@GLIBC_2.2.5+0xb0/0x180 [/usr/lib64/libc-2.17.so] 0x7f17e0665020 : _IO_fclose@@GLIBC_2.2.5+0x180/0x210 [/usr/lib64/libc-2.17.so] 0x4122ba : close_stream+0x1a/0x80 [/usr/bin/ls] 0x40a8b5 : close_stdout+0x15/0xc0 [/usr/bin/ls] 0x7f17e0632e69 : __run_exit_handlers+0xd9/0x110 [/usr/lib64/libc-2.17.so] 0x7f17e0632eb5 : exit+0x15/0x20 [/usr/lib64/libc-2.17.so] 0x40449c : main+0x1aec/0x2198 [/usr/bin/ls] 0x7f17e061bb15 : __libc_start_main+0xf5/0x1c0 [/usr/lib64/libc-2.17.so] 0x404b71 : _start+0x29/0x38 [/usr/bin/ls]

gvisTimeline

如何转换十六进制数以获取文件名和行号?

1 个答案:

答案 0 :(得分:2)

至少有两种可能性

  1. ...通过addr2line程序(binutils的一部分)手动过滤数据。这可能是自动化的,但是很笨拙;像这样的东西,除了可能必须拆分十六进制地址并逐个处理它们。
  2. { system(sprintf("addr2line -e /proc/self/exe %s", ubacktrace())) }
    
    1. ...通过systemtap 2.7的[u]symfile[u]symline函数。这些函数的工作原理是将debuginfo的行记录部分上传到systemtap模块,这些函数可以用来映射到内核用户空间源文件/行。
    2. { hexaddr=tokenize(ubacktrace(), " ")
        ha=strtol(hexaddr,16)
        printf("%p %s:%s", ha, usymfile(ha), usymline(ha))
        while (1) {
            hexaddr=tokenize("", " ") // continue tokenizing
            if (hexaddr=="") break
            ha=strtol(hexaddr,16)
            printf("%p %s:%s", ha, usymfile(ha), usymline(ha))
        }
      }