computerの日記

Cisco,SHELL,C,Qt,C++,Linux,ネットワーク,Windows Scriptなどの発言です

sar-analyzer で segfault したので、coredump を読んでみた ( is sar-analyzer の開発状況(20180927))

sar-analyzer である sa ディレクトリを読んでいたら、segfault したので、coredump を読もうと思い、2カ月前の自分のブログ記事を参照していたら、coredump が剥かれているはずのディレクトリに coredump を吐いていなくて、なんでやねん、と調べていたら、/var/lib/systemd/coredump に吐いていました。

今は、coredumpctl というコマンドもあるみたいで、うわー、変わったなー、と思いました。

/var/lib/systemd/coredump には、以下のような圧縮ファイルがありました。

# ls -lat | head
合計 272220
drwxr-xr-x. 2 root root 24576 9月 26 23:01 .
-rw-r-----+ 1 root root 107818 9月 26 23:01 core.sar-analyzer.1000.067038917e7c41db8dd0d70eecf6c43f.7835.1537970460000000.lz4
-rw-r-----+ 1 root root 107329 9月 26 22:52 core.sar-analyzer.1000.067038917e7c41db8dd0d70eecf6c43f.7454.1537969945000000.lz4
-rw-r-----+ 1 root root 107142 9月 26 22:49 core.sar-analyzer.1000.067038917e7c41db8dd0d70eecf6c43f.7287.1537969759000000.lz4

 これを読むには、まず、sar-analyzer をデバッグオプション付きで以下のようにビルドしなおします。

# gcc -o sar-analyzer -debug -g main.c common_jp.c line_data.c make_report.c sar_analyzer_jp.c setter_getter.c

segfault を起こす環境でこのバイナリを実行して、segfault を起こさせてみます。

$ ./sar-analyzer-debug -D sar_data -ZM

coredump が出ているディレクトリに移動します。

/var/lib/systemd/coredump

圧縮ファイルを解凍します。

# lz4 -d <lz4ファイル名>

gdbデバッグします。

# gdb ./sar-analyzer core.sar-analyzer.1000.067038917e7c41db8dd0d70eecf6c43f.7835.1537970460000000.lz4

(gdb)bt

ここだよ、と教えてくれました。

あとは、ソースコードデバッグ文字なんかを入れていって、printf とかしていきます。

loop のコードをいい加減に書いていて、ファイル名に空文字が入っていないというバグを見つけました(書いたのは私です)。空文字のファイルをオープンしようとして、segfault になっていました。まず、segfault しなくするには、strlen で文字列を計って、0 以下だったら、エラーとして exit させます。

もちろん、loop のところも適切に直しました。まあ、手を抜いていると、こうなるという見本のようなものですね。

秋だなぁ。。