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 コンテナの中身を分かりやすく表示することができるようになります。実例については こちら で説明されています。

emacs24 + ruby-electric.el

emacs 24 (開発版) で新しく導入された機能の一つである electric-pair-mode を使うと括弧を自動で閉じてくれるようになります. ただ ruby のコードを書くときにお世話になっている ruby-electric.el でもすでに似たような補完機能があるため, 閉じ括弧が二回補完されるという, 非常に残念なことになってしまいます. とりあえず以下のような対処方法で解決できました.

リハビリ その2

12月です。先日10年使っていた腕時計が壊れました。大阪市街に買い物に行ったら再び風邪をもらったかも。

メインで使っている、Mac (アップグレードによりインストールした OS X Lion) を諸々の事情でクリーンインストールすることに。リンク 先にもあるように、Lion からはインストールディスクがついてこない代わりに、HD のパーティションに、Recovery HD というものがあるので、それを使いクリーンインストール。最近は重要なデータは雲の上に置いてあるのでそんなに困ることもなかった。Leopard のときからずっとアップグレードだったので、負の遺産(?)も葬り去る。これを気に Desktop というディレクトリも消し去りたいし、MacPorts ともサヨナラしたい。ついでに、昔使ってから久しく使っていなかった Dropbox をインストール。昔は必要性は感じなかったが、こういう時はとても助かりますね。

リハビリ

どうも今月に入り調子が悪いと思っていたら、去年の夏以来のシンドイ思いのする風邪を引いてしまったので、自宅で療養。ずっと寝ていてもなんなので(かといって頭を使うようなことをすると熱が出るので)、以前からやろうと思っていたローカル環境のファイルを淡々と整理する。ついでに MacLinux (ローカル、サーバ)の 3 つの環境でバラバラになって収拾がつかなくなっていた .emacs の山を一つにまとめた。さらについでに風の噂で知った とある Advanced emacs user の設定ファイルを見て、キーバインドも変更しようと思い立ち、片っ端から変更。なぜキーバインドはデフォルトのまま我慢して使っていたのだろうか(ずっと OS の更新をしないまま PC を使っている実家の環境を思い出す)。ほとんどは京都で働いている人のおかげによるところが大きいが、6 年前に使い始めた時に比べたら大分マシになったと思う。

BibTeX-mode メモ

11 月です. カルシウム不足のせいか顎が痛いです.

Emacsbibtex フォーマットのファイルを編集するときに BibTeX-mode というモードになることは知っていたのですが, CiteSeer で取ってきた .bib ファイルがおかしい時, .bib ファイルから不要なフィールド (location, publisher) を削除するときぐらいしか, 手で編集することはなかったので, 長らく適当にしか使っていませんでした. 特に, インデントまわりが個人的に「?」だったのですが, マニュアルを読んだら使い方が少し分かった気がしたのでメモがてらに書いておきます.

インデントまわりの設定

詳しくは ここにちゃんと書いてありますが...

;; bibtex ファイルの行頭のインデント. 
(setq bibtex-entry-offset 0)

;; インデントしたときに, 各フィールドの 「=」の後の項目の開始位置.
(setq bibtex-text-indentation 14)

;; nil 以外に設定すると, C-c C-q したときにエントリーのフィールドの等号を揃えてくれます.
(setq bibtex-align-at-equal-sign t)

よく行う操作に関するキーバインド

  • C-j: bibtex-next-field 次のフィールドへ移動
  • C-c C-q: bibtex-fill-entry エントリーのインデント.
  • C-c C-f: bibtex-make-field 現在のカーソルのあるフィールドの次にフィールドを挿入.
  • C-c C-k: bibtex-kill-field カーソル上にあるフィールドを削除. カンマの取り扱いも対処.
  • C-c C-w: bibtex-kill-entry エントリーを削除.

4ヶ月分のアップデート (アップグレード) をしたら色々壊れた件

10 月です. 4ヶ月近く留守にしていると, LaTeX やら Linux マシンの使い方, ローカルマシンやサーバ群の「どこに,何を置いていたか」などすっかり忘れてしまいました. grep or find で探そうとしてもキーワードが思い出せない. キーワード以外の良い検索方法はないでしょうかね.

Mac OS X

  • Lion にアップグレードしたら, MacPorts で入れた一部のライブラリがおかしくなった. 参考
  • Java の runtime がなくなったのでインストール.
  • Snow Leopard の時にビルドした Emacs 23 が動かなくなったので, ソースを取ってきて再ビルド.
  • プリンタのドライバの問題がおかしいせいか Preview.app から印刷するときに「両面印刷」の項目がない.
  • 11月28日追記: スリープ復帰時に画面が真っ黒になったまま, すぐに復帰してくれないという問題が発生. ここここにも書いてある. どうやら原因は Nvidia のドライバらしい. 対処法はリンク先に書いてあるが...

Linux (Arch Linux)

pacman と yaourt のアップデートしたら, 色々壊れた. 今のところ気づいたもので, クリティカルだったものは以下の通り.