ちなみに

火曜日の空は僕を押しつぶした。

Core dumpさせたプログラムを追いかけるよ!

最近愛用しているMUA(メーラーですね)のmuttでPOP使ってリモートのメールを取ってこようとすると、Segmentation faultになって落ちるようになってしまった。(いきなり
原因がわからないのでCore dumpして追い掛けてみた。

まずはCore dumpします。

$ ulimit -c unlimited
$ ulimit -c
unlimited

そして、muttを走らせて落とします。(POP3でメールを取りに行かせると落ちる)
すると、ホームディレクにcoreというファイルが出来ます。
こいつはdumpした内容ですね。

次にgdbで追っかけます

$ gdb mutt ./core

中略

Core was generated by `mutt'.
Program terminated with signal 11, Segmentation fault.
[New process 6137]
#0  0xb7e0aff4 in _gnutls_x509_crt_get_raw_dn2 (cert=0x11, whom=0xb7e45367 "issuer", start=0xbfd90014) at x509.c:1718
1718    x509.c: No such file or directory.
        in x509.c
(gdb)

こんな感じで止まるので、
btとかlistを使って追い掛けます。

この時、追いかける対象のソースコードがあればlistでバックトレースしたときの周辺のソースコードまで見ることが出きるのでかなりいい感じです。

たとえば

(gdb) bt
#0  0xb7e0aff4 in _gnutls_x509_crt_get_raw_dn2 (cert=0x11, whom=0xb7e45367 "issuer", start=0xbfd90014) at x509.c:1718
#1  0xb7e0fc9a in is_issuer (cert=0xb7e43dce, issuer_cert=0x8197f88) at verify.c:164
#2  0xb7e10b12 in _gnutls_verify_certificate2 (cert=0x11, trusted_cas=<value optimized out>, tcas_size=142, flags=0, output=0xbfd900d8) at verify.c:199
#3  0xb7e11381 in gnutls_x509_crt_list_verify (cert_list=0x82f0828, cert_list_length=0, CA_list=0x82f0548, CA_list_length=142, CRL_list=0x0, CRL_list_length=0, 
    flags=0, verify=0xbfd9019c) at verify.c:396
#4  0xb7df364c in _gnutls_x509_cert_verify_peers (session=0x82f4040, status=0xbfd9019c) at gnutls_x509.c:176
#5  0xb7de5921 in gnutls_certificate_verify_peers2 (session=0x82f4040, status=0xbfd9019c) at gnutls_cert.c:606
#6  0xb7de5959 in gnutls_certificate_verify_peers (session=0x82f4040) at gnutls_cert.c:639
#7  0x080d46d8 in tls_check_certificate (conn=0x8196f10) at ../mutt_ssl_gnutls.c:509
#8  0x080d5ad8 in tls_negotiate (conn=0x8196f10) at ../mutt_ssl_gnutls.c:269
#9  0x080d5c85 in mutt_ssl_starttls (conn=0x8196f10) at ../mutt_ssl_gnutls.c:162
#10 0x080d00aa in pop_open_connection (pop_data=0x8196938) at ../pop_lib.c:304
#11 0x080cd55d in pop_fetch_mail () at ../pop.c:772
#12 0x08067955 in mutt_index_menu () at ../curs_main.c:848
#13 0x080825b8 in main (argc=1, argv=0xbfd92af4) at ../main.c:1005
(gdb) f 13
#13 0x080825b8 in main (argc=1, argv=0xbfd92af4) at ../main.c:1005
1005    #endif
(gdb) l
1000          if (Context)
1001            FREE (&Context);
1002        }
1003    #ifdef USE_IMAP
1004        imap_logout_all ();
1005    #endif
1006    #ifdef USE_SASL
1007        mutt_sasl_done ();
1008    #endif
1009        mutt_free_opts ();
(gdb)

こんな感じで使います。

結局

エラーを吐いているのは、libgnutls26の_gnutls_x509_crt_get_raw_dn2の中だと言うことしか分かりませんでした。
おわり。

# おなじところで落ちているという話がlinux.debian.bugs.dist Google groupでされていたみたいなので後でちゃんと追う。

(追記)
もしかしてこれかな
[#505279 - libgnutls26: segfault in _gnutls_x509_crt_get_raw_dn2 - Debian Bug report logs

(追追記)
これですね。
2.4.2-2ではmuttが落ちるそうです。
2.4.2-1に落とすようにとのことですが、依存関係の問題の為か、2.4.2-2しか利用可能になっていません。
依存しているものもまとめてバージョンを落とすこととか出来るのかな。