GNUウイーク - gccのC++化 / gdb7.5

なんというか今週はGNUウイークだったような気がする。最大のトピックはgccC++化だけど、これはまぁ方々で語り尽くされているので。。

gdb 7.5

gdbの7.5も今週リリースされた。これは結構注目すべきアップデートで:

  • Go言語のサポート
  • Linux の OS情報取得機能

"info os"コマンドで、プロセスのリストやメッセージキュー等を取得できるようになった。
もちろん相応の権限が必要になるが、マルチプロセスデバッグのサポート等は熱い分野なので今後も充実が期待される。

  • DWARF対応の改善
    • inline関数に対してブレークポイントを設定できるようになった
    • enumをORしている変数の値をデコードできるようになった

この手のデバッグサポートの充実により、Cスタイルのマクロは今後ますます避けられるようになるかもしれない。DWARFはマクロに対するデバッグ情報もそれなりにサポートしているが、まだまだうまく活用されていない。

いわゆるDtraceのSDTに対してブレークを張ったりできるようになった。今のところSystemTapによって生成されたSDTにのみ対応している。

  • x32 ABIのサポート

x32 ABIはポインタとして32bitを用いるx86-64 ABIのバリアントで、Intelが微妙に推進している。公式サイトはGoogle sites( https://sites.google.com/site/x32abi/ )だったりABIドラフト(のTeXソース)はGitHub( https://github.com/hjl-tools/X32-psABI )だったりとかなり方々で開発が展開されている。

  • リモートスタブの強化とIn Process Agent(IPA)の導入

デバッグスタブに簡単なスタックベースのVMが導入され、gdb側からバイトコードを注入して細かい判断を行わせることができるようになった。
これは、条件付きブレークポイント等を高速に実行するために利用できる。バイトコードの仕様はgdbのマニュアルにある( http://sourceware.org/gdb/current/onlinedocs/gdb/Agent-Expressions.html )。

  • gdb-tuiの本体への統合

cursesを持っていれば、GDB実行バイナリ自体が簡単なTUIを備えるようになる。これに伴い、gdb-tuiバイナリは廃止された。

  • stdio経由のリモートスタブ

gdbserverとの通信にstdioが使えるようになった。この機能の強力な点はssh経由でgdbserverを起動するようなケースで:

(gdb) target remote | ssh -T hostname gdbserver - hello

のようにして子プロセスとしてgdbserver(に接続するssh)を起動できる。gdbserverはstderrとstdoutは適当にpipeしてデバッギを起動するので、出力の観察は依然可能となっている。
sshの向こうにあるプロセスをデバッグしたい時に役立つかもしれない。

gdbとlldb

gccのライバルがclangになっているように、gdbにもlldbというライバルが一応居る。ただ、lldbはまだ広くデプロイされている状況ではなく、XCode以外にはいまのところ大口のユーザは居ない。
重要な共通点はどちらもスクリプティング言語としてPythonを採用している点で、gdbもlldbもこの点は近年急速に発展している。
lldbはリモートの考察が無い。エンベデッドの領域やOSデバッガとしてはまだgdbの独壇場だろう。