«

2013.06.03

EmacsとgdbでVisual Studioライクなデバッグ環境

C言語を勉強するとき,文法や標準関数をマスターすることに並ぶくらい重要なのが,デバッガを使いこなせるようになることです.C言語を習いたての頃は,書いたコードが予期せぬ動作をしたり,ポインタの使い方を間違えてプロセスを落とすこと(セグメンテーション違反)なんてザラです.そういう失敗をたくさん経験して,自分の書いたコードの間違いに気づき,修正していくことでコーディング力が養われていきます.しかし,自分の書いたプログラムの何処が悪いのか,皆目見当もつかないような状況に陥ってしまうと,プログラミングが嫌いになってしまいます.

デバッガを文字通りに解釈すると「バグを取る」ためのツールで,プログラマにとってはコードの間違いを発見するための検証手段として欠かせません.これに加えて,正しいコードをデバッガ上で動かしてみることも,C言語の理解促進のために重要であると私は考えています.ループや条件分岐でプログラムの流れがどのように変わるのか,ポインタは具体的にどんな値を取っているのか,main関数のargcやargvにはどんな値がセットされているのか,関数呼び出しでどのようにスタックフレームができるのか,auto変数・static変数でメモリ空間がどのように使われているのか等,デバッガを使ってプログラムの動きを追ってみることで,C言語やコンピュータ・アーキテクチャの勉強になります.

かくいう私も20数年前,Microsoft Quick C 2.0という開発環境でC言語を勉強しました.20年以上前の製品ですが,Quick CはC言語の初心者に優しい逸品でした.MS-DOS上で動作するコンソール・アプリケーションながら開発統合環境として動作し,エディタ,コンパイラ,デバッガの機能が一通り揃っていました.特にデバッガが秀逸で,ブレークポイント,ステップ実行,ウォッチ変数などがエディタ上から操作できました.Quick Cのデバッガが使いやすかったお蔭で,挫折せずにC言語の勉強が出来たと言っても過言ではありません.この頃に習得したデバッグの技(操作体系)から離れられず,C/C++のコーディングにはMicrosoft Visual Studioを用いてきました.研究用のC言語のプログラムは,Windows上で開発してからlinux上に移植しています.

今回,東北大学のプログラミング演習Aという講義でデバッガの使い方を教えようと思い立ち,色々調べていくと,emacsとgdbでMicrosoft Visual Studioに近いデバッグ環境が実現できることを知りました.元々emacs+gcc使いの人には常識なのかもしれませんが,”emacs gdb”で検索して上位に出てくるようなページを見るだけでは,いまいちピンと来ていませんでした.あまりにも感動したので(本当は講義のためですが),emacsでC言語のプログラムをデバッグする例を紹介するムービーを作っちゃいました.サクサクとデバッグできる感じを伝えたかったので,ゆっくりと説明するような作りになっておらず,字幕を読むのはキツイかもしれません.そんなときは,ムービーを止めながら観て頂ければと思います.文字が滲んで見づらい場合は画質を上げて下さい(オリジナルは1080pのHD画質).

このムービーで使っているバグ入りコード(sum.c)とemacsの設定ファイル(gdb.el)です.この設定ファイルでは,gdb-many-window, gdb-use-separate-io-buffer, gud-tooltip-modeと,以下のようなショートカットキーを採用し,快適なデバッグ環境を実現しています.

  • [F1]: カーソル位置(もしくはリージョン)の変数の内容を表示(gud-print
  • [Shift]+[F1]: カーソル位置の変数をウォッチに追加(gud-watch
  • [F5]: プログラムの実行を再開(gud-cont
  • [Shift]+[F5]: デバッガを終了
  • [F6]: カーソル行まで実行(gud-until
  • [F9]: カーソル行のブレークポイントを設定/解除(gud-breakもしくはgud-remove
  • [Shift]+[F9]: main関数の先頭行にブレークポイントを設定(gdbに”break main”と入力するのと等価)
  • [F10]: ステップオーバー(現在行を実行,関数の中には入らない)(gud-next
  • [F11]: ステップイン(現在行を実行,関数の中にも入る)(gud-step
  • [Shift]+[F11]: ステップアウト(現在の関数を抜けるまで実行)(gud-finish

(GUDのデフォルトでは,ステップオーバーやステップインのために3ストロークが必要のようですが,それって疲れないのかなぁ)

Comment & Trackback

Comments and Trackback are closed.

> (GUDのデフォルトでは,ステップオーバーやステップインのために3ストロークが必要のようですが,それって疲れないのかなぁ)

gud使いの多くは,これらの3ストロークのコマンドは使って無いと思います

代わりにgud のプロンプトで “f” とか “s”コマンドを実行します.

これだと”f”+エンターで 2ストロークになり
さらに同じコマンドを再度実行するときは
エンターのみでOKなので実質1ストロークです