2016-06-20 2 views
0

J'utilise strace et SystemTap pour obtenir des traces de pile lors d'appels système. Ce que je reçois actuellement montre le nom de la fonction mais pas le nom du fichier et le numéro de ligne. Une trace de strace sur ls en utilisant -k Option:Convertir des symboles de débogage en fichiers et en numéros de ligne

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

Un autre de SystemTap à nouveau de ls avec une légère modification de strace.stp dans les exemples:

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] 

Comment puis-je convertir les nombres hexadécimaux pour obtenir les noms de fichier et les numéros de ligne?

Répondre

2

Il y a au moins deux possibilités

  1. ... filtrer manuellement des données par l'intermédiaire du programme addr2line (partie de binutils). Cela peut être possible d'automatiser, mais maladroit; quelque chose comme ça, sauf que l'un peut devoir séparer les adresses hexadécimales et les traiter une par une.
{ system(sprintf("addr2line -e /proc/self/exe %s", ubacktrace())) } 
  1. ... par [u]symfile et [u]symline de systemtap 2.7 fonctions. Ces fonctions fonctionnent en chargeant des parties d'enregistrement en ligne de l'information de débogage dans le module systemtap, que ces fonctions peuvent utiliser pour mapper au noyau/files d'attente de l'espace utilisateur.
{ 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

Merci, la première solution fonctionne très bien, mais est lente. Je n'ai pas pu faire fonctionner le second. on dirait que stap ne regarde pas les informations de débogage des paquets de l'espace utilisateur –

+0

Oui, un bug a dû apparaître récemment. Peut-être que vous frappez aussi https://sourceware.org/bugzilla/show_bug.cgi?id=20288. – fche

+0

Merci de confirmer et de créer le rapport de bogue. –