0

strace と SystemTap を使用して、システム コールでスタック トレースを取得しています。私が現在取得しているのは関数名を示していますが、ファイル名と行番号は示していません。オプションをls使用した strace からのトレース:-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例の をわずかに変更したSystemTap からの別strace.stpのもの:

 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]

16 進数を変換してファイル名と行番号を取得するにはどうすればよいですか?

4

1 に答える 1

2

少なくとも2つの可能性があります

  1. addr2line...プログラム(binutilsの一部)を介してデータを手動でフィルタリングします。これは自動化できるかもしれませんが、扱いにくいです。このようなものですが、16 進アドレスを分割して 1 つずつ処理する必要がある場合があります。
{ system(sprintf("addr2line -e /proc/self/exe %s", ubacktrace())) }
  1. ... systemtap 2.7[u]symfile[u]symline関数を通じて。これらの関数は、debuginfo の行レコード部分を systemtap モジュールにアップロードすることで機能します。これらの関数は、これらの関数を使用して、カーネル|ユーザー空間のソース ファイル/行にマップできます。
{ 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))
  }
}
于 2016-06-20T21:11:41.133 に答える