最近愛用している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しか利用可能になっていません。
依存しているものもまとめてバージョンを落とすこととか出来るのかな。