gdb hacks - gdbcalc スクリプト
gdb hacks 第 4 回。前回は gdb 電卓で使えるようになった数学関数のかっこ悪さについて不満を述べましたが、それを一部解決する方法を思いついたのでまとめておきます。
当初は sqrt といった関数シンボルに新たな型情報を設定する方法があるのではないかと思い、gdb のソースなどを調べていたのですが、どうもそんな都合のいい方法はなさそうなので、あきらめて別の方法を考えました。
gdb では convenience variable という $ で始まる任意の名前の変数を使うことができますので、それに関数シンボルのアドレスを関数ポインタ型でキャストして代入してみます。
(gdb) set $sqrt = (double (*)(double)) sqrt (gdb) set $pow = (double (*)(double, double)) pow (gdb) ptype $sqrt type = double (*)() (gdb) ptype $pow type = double (*)() (gdb) p $pow($sqrt(5.0), 2.0) $1 = 5.0000000000000009
どうやらうまくいっています。残念ながら引数の型情報については gdb は無視してしまうようです。
この方法はデバッグ情報入り glibc などを別途用意する必要がなく gdb だけで完結できるのが利点です。しかし $pow() や $sqrt() など、すべての関数に $ を忘れずつけなくてはならないのはあいかわらず面倒といえます。また引数型情報はないので $sqrt(4) のように想定外の型の値を渡さないように注意しないといけません。
さて、仕上げとしてコマンドラインから手軽に呼出して使える gdbcalc スクリプトというものを書いてみました。gdb スクリプトのユーティリティというのはなかなか珍しいでしょう。
#!/usr/bin/gdb -x file /usr/bin/gdb start set $e = 2.7182818284590452354 set $pi = 3.14159265358979323846 set $fabs = (double (*)(double)) fabs set $sqrt = (double (*)(double)) sqrt set $cbrt = (double (*)(double)) cbrt set $exp = (double (*)(double)) exp set $exp2 = (double (*)(double)) exp2 set $exp10 = (double (*)(double)) exp10 set $log = (double (*)(double)) log set $log2 = (double (*)(double)) log2 set $log10 = (double (*)(double)) log10 set $pow = (double (*)(double, double)) pow set $sin = (double (*)(double)) sin set $cos = (double (*)(double)) cos set $tan = (double (*)(double)) tan set $asin = (double (*)(double)) asin set $acos = (double (*)(double)) acos set $atan = (double (*)(double)) atan set $atan2 = (double (*)(double, double)) atan set $sinh = (double (*)(double)) sinh set $cosh = (double (*)(double)) cosh set $tanh = (double (*)(double)) tanh set $asinh = (double (*)(double)) asinh set $acosh = (double (*)(double)) acosh set $atanh = (double (*)(double)) atanh
使いそうな関数だけ定義しています。他に必要な関数があったら適宜追加してください。
関数呼出しに必要なコンテキストを提供するターゲットプロセスですが、そのへんにある適当な ELF 実行形式ファイルをつかまえて実行し main() 前で寸止めしておけば OK なので、ここでは gdb 自身を使っておきました。libm.so がリンクされているので LD_PRELOAD をいじって読み込ませる必要もなく都合がよいと言えます。
まだまだ改良の余地がある気がしますが、ひとまずこれで満足して今後しばらく使ってみることにします。
つづく。
カテゴリ
gdb hacksトラックバック(0)
このブログ記事を参照しているブログ一覧: gdb hacks - gdbcalc スクリプト
このブログ記事に対するトラックバックURL: http://www.keshi.org/mt/mt-tb.cgi/34
コメントする