「止まる」「遅い」を元から絶つ!オープンソースのトラブル解決】第1回 アプリケーション異常終了 ITpro
strace :システムコールを追跡
ltrace : ライブラリコールを追跡する
ltraceの使い方
ltrace [option ...] [command [arg ...]]
代表的なオプションとして,下記がある。
・-f: 子プロセスの挙動もあわせてトレースする
・-o fname: トレース結果をファイルに保存する
・-S: システムコールも表示する
・-t: タイムスタンプも表示する
・-p PID: 実行中のプログラムをトレースする
トレース結果
$ ltrace test_app
:(省略)
5421 sleep(1) = 0
5421 malloc(10485760) = 0x927b3008
5421 printf("%u?tmsg-out: %d?n", 59, 10485760) = 22
5421 sleep(1) = 0
5421 malloc(10485760) = NULL
5421 --- SIGSEGV (Segmentation fault) ---
5421 +++ killed by SIGSEGV +++
malloc関数にnullが返されそのその後、セグメンテーション違反が発生している。
上記に対し、ソースコードから解析する。
コアダンプによる解析
$ gdb test_app core.5421
| :(省略)
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x08048537 in write_buf () at test_app.c:18
18 p[i] = 'a';
(gdb)