2016-06-20 27 views
0

Ich verwende strace und SystemTap, um Stack-Traces bei Systemaufrufen zu erhalten. Was ich gerade bekomme, zeigt den Funktionsnamen, aber nicht den Dateinamen und die Zeilennummer. Eine Spur von strace auf ls mit -k Option:Debugging-Symbole in Dateien und Zeilennummern konvertieren

> /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] 

Ein anderes von SystemTap wieder von ls mit einer leichten Modifikation von strace.stp in den Beispielen:

0x7f17e06eb607 : munmap+0x7/0x30 [/usr/lib64/libc-2.17.so] 
0x7f17e0672882 : _IO_setb+0x62/0x70 [/usr/lib64/libc-2.17.so] 
0x7f17e0671030 : [email protected]@GLIBC_2.2.5+0xb0/0x180 [/usr/lib64/libc-2.17.so] 
0x7f17e0665020 : [email protected]@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] 

Wie konvertiere ich die hexadezimalen Zahlen zu erhalten die Dateinamen und Zeilennummern?

Antwort

2

Es gibt mindestens zwei Möglichkeiten

  1. ... manuell Filterung Daten durch das Programm addr2line (Teil von binutils). Dies ist möglicherweise zu automatisieren, aber schwerfällig; etwas ähnliches, außer dass man die Hex-Adressen aufteilen und einzeln verarbeiten muss.
{ system(sprintf("addr2line -e /proc/self/exe %s", ubacktrace())) } 
  1. ... durch systemtap 2.7 des [u]symfile und [u]symline Funktionen. Diese Funktionen arbeiten, indem Line-Record-Teile der Debuginfo in das systemtap-Modul hochgeladen werden, die diese Funktionen verwenden können, um Kernel-Userspace-Quellendateien/-Zeilen zuzuordnen.
{ 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)) 
    } 
} 
+0

Dank, die erste Lösung funktioniert gut, aber langsam. Ich konnte den zweiten überhaupt nicht arbeiten lassen. es sieht aus wie stap ist nur nicht auf die Debug-Informationen der Userspace-Pakete –

+0

Yeah, einige Bug muss vor kurzem aufgetaucht. Vielleicht treffen Sie auch https://sourceware.org/bugzilla/show_bug.cgi?id=20288. – fche

+0

Vielen Dank für die Bestätigung und Erstellung des Fehlerberichts. –