・gdbとpython
ほとんどメモ程度。
自分ではやったことないのだけど、 最近のgdb(7.4.x)ではgdbからpythonを起動してあれこれ操作できるようになっているらしい。 それに合わせて、いくつかのパッケージではgdb用のpythonモジュールを用意するようになっている。
その一つがlibstdc++.so.6.0.16-gdb.pyで、最近では/usr/share/gdb/auto-load/以下に収めるようになっているけど、 一時は/usr/lib/ 直下にインストールされて、ldconfigが動くたびに「これ、バイナリファイルとちゃう!」なメッセージが出ていたのは ご存知の方もいるだろう。
glibも最近のバージョン(確認したのは2.31.10)ではglib.pyとgobject.pyなるモジュールを提供していて (/usr/share/glib-2.0/gdb/) glib系のバイナリをgdbで追いかけようとするとこのモジュールが呼ばれるらしい。
で、このモジュールのうちgobject.pyには、
import gdb.backtrace import gdb.command.backtrace
という指定があるのだけど、このgdb.{,command.}backtraceが見つからない、というエラーになってしまう。
このgdb.backtraceやgdb.command.backtraceというのは、どこから提供されるべきなのだろう、、 とあちこち探し回ったのだけど、どうやらfedora系で採用している開発版gdbに別途パッチをあてることで できるモジュールらしい。
GNU Projectが公開しているgdbの最新版は7.4.1なんだけど、fedoraでは gdb-7.4.50.20120120-17.fc17.src.rpm というバージョンを採用していて、このSRPMファイルを開くと、gdb-7.4.50.20120120に対する gdb-archer.patchというパッチがあり、このパッチをあてることでgdb.backtrace等のモジュールができる模様。
$ ls -R work/usr/share/gdb/python/gdb/ work/usr/share/gdb/python/gdb/: FrameIterator.py FrameWrapper.py __init__.py backtrace.py command/ function/ printing.py prompt.py types.py work/usr/share/gdb/python/gdb/command: __init__.py backtrace.py ignore_errors.py pahole.py pretty_printers.py prompt.py require.py upto.py work/usr/share/gdb/python/gdb/function: __init__.py caller_is.py in_scope.py
ちなみにgdb-archer.patchというのは、http://sourceware.org/gdb/wiki/ProjectArcher で開発されている、 GDBに対する開発版のブランチらしい。
多分、gdbの次のバージョン(7.5系)ではこのあたりの機能が採用されることになるのだろうけど、 gdb公式の最新版に無い機能をglibの側で使ってしまう、というのはどんなもんだろう。。 まぁ、現実的にはこのモジュールが無くてもgdbの基本機能は動作するようなので、 gdbの開発速度が遅いことに対する抗議の一種という気もしないでもないところではある。。