fu7mu4’s diary

はてなダイアリーから移転しました。

今日のデバッガ環境巡り

Emacs 24.1 / Mac OS X(Lion)を使っているんだけれども、唐突にデバッグしたくなったので、いろいろ調べてみた。
結論をいうと、Emacserはみんな、gdbをtarballからbuildして承認すればいいよ! Vimerは cgdbでいいんじゃないかな。

え、Xcode?? なんですか、それは?

*Front End *debugger *status
CUI apple gdb (6.3) so-so
Emacs 24.1 apple gdb (6.3) bad
Emacs 24.1 macport gdb (7.3) not well
Emacs 24.1 macport gdb (7.3) with certificated not well
Emacs 24.1 original gdb (7.4) with certificated good
cgdb apple gdb (6.3) good

"there's more to life than this !"

発端

Emacs 24.1からM-x gdbすると、gdb -i=mi a.outってでて、そのあとうまく動かなくなってた。
どうやら、Emacs 24.1からは デバッガとの通信が MI になるそうで、apple gdb(6.3)が対応していないみたいなんですね。

それで、gdbをターミナル.appから使ってるのもどうかなと思ったので、better halfならぬ、better debuggerを捜しにいきました。

macport gdb

まずは、mac port提供のgdbです。

情報
名前 version パス
gdb 7.3 /opt/local/bin/ggdb

インストール方法

sudo port install gdb
Emacsからの使用

なんかおかしい。やたらエラーがでている。

macport gdb + 承認

次にmac port提供のgdbを承認してみました。

情報
名前 version パス
gdb 7.3 /opt/local/bin/ggdb

Key Chainの証明書発行と承認はこちらを見てやりました。

Emacsからの使用

なにかがちがうような??

gdbの最新安定版

名前 version パス
gdb 7.4.1 /usr/local/bin/gdb
ダウンロード

ftp://sourceware.org/pub/gdb/releases/ここからもらう。

インストール

解凍してそのまま、configure , make , sudo make installでいけるとかいてあったけど、それ無理だった。
make で version.hが見つからないと言われた。

ので、みてみるとincludeの場所がおかしいようだったので、修正。

cd gdb/python
vi gdb/python/python.c
diff -u python.c~ python.c
+++ python.c	2012-07-01 12:32:06.000000000 +0900
--- python.c~	2012-01-15 03:04:05.000000000 +0900
@@ -65,7 +65,7 @@
 #include "python-internal.h"
 #include "linespec.h"
 #include "source.h"
-#include "version.h"
+#include "../version.h"
 #include "target.h"
 #include "gdbthread.h"
 #include "observer.h"

それから make, make installで OK

承認

Key Chainの証明書発行と承認はこちらを見てやりました。

Emacsでの使用感

いいかんじだよ。

別解 cgdb

これは viに似たUIをもつ、gdbのフロントエンド。Emacsから使えないけど緊急避難としてgdbを使うにはいいかもしれない。

そのまま、applegdbを使うから承認もいらない。
お手軽である。

To Anonymousさんへ、

PATHの方ですね。たぶん、これをEmacsの設定ファイル(init.el or .emacs) に加えるといいと思います。直にgdbを指定できるかもしれませんが、これがお手軽だったので。

他の設定に影響しないように最後の方に加えてみてください。

;;;; Gdb
;;; /usr/local/bin/gdbを優先するために、実行パスの先頭に追加
(add-to-list 'exec-path "/usr/local/bin") 

(setq gdb-many-windows t)

;;; 変数の上にマウスカーソルを置くと値を表示
(add-hook 'gdb-mode-hook '(lambda () (gud-tooltip-mode t)))

;;; I/O バッファを表示
(setq gdb-use-separate-io-buffer t)

;;; t にすると mini buffer に値が表示される
(setq gud-tooltip-echo-area nil)