NF

地方で働くプログラマ

14回目:gdbinit(2)

1回目:gdbinit - NF
前にgdbinitについて書きましたが、実際使った時に色々気を付ける事とかあったので追記です。

  • set auto-load local-gdbinit

gdbを実行するカレントパスのgbdinitを読み込むという設定らしいですが、デフォルトのgdbinit(guestなら例えば/home/guest/.gdbinit)に書いておく必要があります。
 

  • set auto-load safe-path /

auto-loadする場合に信頼できるディレクトリを設定します。同じくデフォルトのgdbinitに書いておきます。オフライン環境とかでセキュリティとか気にしないよ、って場合は「/」で良いようです。これを設定しておかないと、gdb実行時にセキュリティ警告が出て、カレントのgdbinitが読み込まれませんでした。詳細は以下。
Auto-loading (Debugging with GDB)
 

  • set breakpoint pending on

前回記事のステップ2で紹介した部分ですが、リンク先をそのままgdbinitに書いたら、gdb実行時にcommands(以下サンプルの2行目)でエラーが出て失敗しました。これは、breakで止めたいソースやシンボルが読み込まれる前にbreakを実行すると「Make breakpoint pending on future shared library load? 」みたいな質問が出ますが、デフォルトでNo(break設定しない)が選択されてしまいます。そのため、commands文でbreakpoint設定されてないよ、みたいなエラーになります。
これを回避するには、「set breakpoint pending on」を書いておいてシンボル解決等を後回しにします。

break sum.c:6
commands
    silent
    printf "i=%d, j=%d\n", i, j
    continue
end

 

  • silent

これも前回の記事にでしれっとリンクしていましたが、breakで止まった時の「Breakpoint 1, main() at sum.c:6」みたいなログを止まる度に出さないようにする設定ですね。breakを複数登録する場合とかは設定しないのもアリかもしれません。
 

  • set print pretty on

gdb中にprintでクラスとか構造体を出力する際に、ある程度整形しておけます。
 

前回記事のステップ3でも少し書きましたが、分かり辛かったので補足です。
私の環境(python2.7+gdb4.x)でやった事は1つだけで、カレントの.gdbinitの1行目に「python gdb.COMPLETE_EXPRESSION = gdb.COMPLETE_SYMBOL」を挿入しただけでした。注意点としては置換じゃなくて挿入って事ですね。元々1行目の「python」は消さずに2行目に書いてある必要があります。
 

  • GDB Dashboard実行実行時に他のgdbinit設定する場合

Dashboard使う時はgdbinit自体がpythonスクリプトになっちゃうので、これまで紹介してきた設定が出来ないですね。この場合、例えばguestユーザなら/home/guest/.gdbinit.d/.gdbinitに書いておけるようです。
でもこれだと結局デフォルトのフォルダに書いて置かないとならない…?よく分からず。


という訳でここまでのまとめです。紹介したやつ全部設定するには以下の通り書きます。

  • /home/guest/.gdbinit(デフォルト)
set auto-load safe-path /
set auto-load local-gdbinit
  • /home/guest/projectA/xxx/.gdbinit(Dashboard使用時は~/.gdbinit.d/.gdbinit)
set breakpoint pending on
set print pretty on
break sum.c:6
commands
    silent
    printf "i=%d, j=%d\n", i, j
    continue
end


おわり