「止まる」「遅い」を元から絶つ!オープンソースのトラブル解決】第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)