NF

地方で働くプログラマ

1回目:gdbinit

書くと言ったのでやります。1回目はgdbinitについて。
gdbinit(5) - Linux manual page

ステップ1:よく使うコマンドを設定しておく

まずは初歩。gdb起動したあと毎回打つコマンドとかある場合、gdbinitに書いておくと起動時に自動で設定されます。例えばRealtimeシグナル使ってるプログラムとかだと、設定したbreakpoint以外でシグナル飛んできて止まったりするので、"handle SIGxx noprint nostop"とか打って抑制したりします(xxがシグナル番号)が、これを書いておきます。
~/.gdbinitを作って以下の内容を記載します。1行目はgdb起動時に自動で.gdbinit読み込む命令。なお.gdbinitはホーム以外にカレントにも置けるし読み込み先も指定できますが、ステップ3みたいに.gdbinit.d/とか使う場合はパスに気を付ける必要あり。

set auto-load local-gdbinit
handle SIG35 noprint nostop

あとは、ダンプ時にEnter押さなくて済むように"set pagination off"とか設定してます。

ステップ2:printfデバッグの代用

この内容そのままです。(ステップ1と同じくset auto-load …は書く必要あり)
printf()を書くかわりに.gdbinitを書く - iakioの日記
毎回breakで止めなくても、自動でbreak→print→continueを実行してくれます。あと、デバッグ出力入れるためのリコンパイル出来ない環境とかで有用です。

ステップ3:GDB Dashboard

最後です。.gdbinitに書くだけでグラフィカルな表示でデバッグできます。pythonで書いてあるようです。実際どれくらい有用か分かりませんが、見た目が良いので面白いかも。
GitHub - cyrus-and/gdb-dashboard: Modular visual interface for GDB in Python

注意点としては、pythomやgdbのバージョンが古いとひと手間必要のようです。
Python/GDB compatibility issues · Issue #1 · cyrus-and/gdb-dashboard · GitHub
リンク先の「Here's a dirty script …」の下だけ実行すれば良さそうです。ホームに~/.gdbinit.d/を作ってリンク先のFrameDecorator.pyを置いておき、gdb.COMPLETE_EXPRESSIONの置換コマンドを追加、最後に.gdbinitにFrameDecorator読み込み処理を追加。
自分が試した環境はpython2.7+gdb4.xでしたが、これでそれなりに動きました。


今日はこんな感じで。
 
(追記)
続きというか補足を書きました。
14回目:gdbinit(2) - NF