OS X Lion で新しい gdb が動くようになったみたいなんですよ

師走です。今年の反省点の一つとして、プログラムのデバッグに対する一層の鍛錬が必要だと思い知らされました。ここで言うバグとは単にコンパイルが通らないというものだけでなく、メモリリークや結果の再現ができないなども含めてバグと考えています。デバッガをうまく使って鼻歌交じりにバグを取ることができていれば、最終バスを何度も逃すこともなく、毎晩夜遅くまでディスプレイと睨めっこすることもなかったかもしれません。
さて、今日が何の日かは知りつつも メーリングリスト経由で、開発版の gdbOS X Lion で動くようになったらしいということを知ったのでメモしておきます。gdb を使わない人、Xcode をインストールしたときに一緒についてくる gdb 6.3.x で満足している人には無関係な話題です。まだ完全には Lion に対応できていないようですが、開発版の gdb 7.4 用のブランチで OS X Lion 用の修正が入っているようです(参考)。なお、開発版に関する情報なので、言うまでもなく一週間後には状況が変わっているかもしれませんので、内容の正確性については保証できかねます。予めご了承ください。

手元の環境は以下の通り。

$ uname -a
Darwin shouga 11.2.0 Darwin Kernel Version 11.2.0: Tue Aug  9 20:54:00 PDT 2011; root:xnu-1699.24.8~1/RELEASE_X86_64 x86_64
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.7.2
BuildVersion:   11C74

コードを入手する

cvs -d :pserver:anoncvs@sourceware.org:/cvs/src co -r gdb_7_4-branch gdb

後は ./configure && make 。もしコンパイルがこけたら、"version.h" に関するエラーかもしれません。

Index: python.c
===================================================================
RCS file: /cvs/src/src/gdb/python/python.c,v
retrieving revision 1.79.2.1
diff -r1.79.2.1 python.c
35c35
< 
    • -
> #include "../version.h"

詳しくは http://sourceware.org/gdb/ を参照またはメーリングリストを検索してみてください。

GDB に権利を

なんとかコンパイルが通り一件落着、いざ使おうと思っても、そうは問屋が卸しません。こちら に書いてあるように、kernel にとってデバッガに好き勝手にプロセスをコントロールされるとセキュリティ的によろしくありません。実際、自前でビルドした gdb を一般ユーザで実行すると怒られてしまいます:

$ ls
a.out*      a.out.dSYM/ test.cc
$ ~/local/src/gdb_7_4-branch/gdb/gdb ./a.out
GNU gdb (GDB) 7.3.91.20111223-cvs
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin11.2.0".
For bug reporting instructions, please see:
http://www.gnu.org/software/gdb/bugs/...
Reading symbols from /Users/tetsuo-s/cpp-programs/a.out...Reading symbols from /Users/tetsuo-s/cpp-programs/a.out.dSYM/Contents/Resources/DWARF/a.out...done.
done.
(gdb) start
Temporary breakpoint 1 at 0x100000fa6: file test.cc, line 8.
Starting program: /Users/tetsuo-s/cpp-programs/a.out 
Unable to find Mach task port for process-id 43604: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))
(gdb) 

GDB Wiki で述べられている説明に従ってcertificate を発行し、自前でビルドした gdb に特別に許可を与えることで怒られずに済むようになります。日本語ではこちらのエントリー が分かりやすいと思います。

Python による pretty printer を使う

gdb 7.0 から Python による pretty-printer 用のモジュールが提供され、pretty printer 用の python ライブラリを自作するか、適当なところから取ってきて、$HOME/.gdbinit にそれらを読めるように設定すると、例えば STL コンテナの中身を分かりやすく表示することができるようになります。実例については こちら で説明されています。