gdb hacks - gdbcalc スクリプト

| | コメント(0) | トラックバック(0)

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 をいじって読み込ませる必要もなく都合がよいと言えます。

まだまだ改良の余地がある気がしますが、ひとまずこれで満足して今後しばらく使ってみることにします。

つづく。

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: gdb hacks - gdbcalc スクリプト

このブログ記事に対するトラックバックURL: http://www.keshi.org/mt/mt-tb.cgi/34

コメントする

このブログ記事について

このページは、yaegashiが2006年3月 2日 04:46に書いたブログ記事です。

ひとつ前のブログ記事は「gdb hacks - gdb を電卓の代わりに使う」です。

次のブログ記事は「Spartan-3E Starter Kit 予約受付開始」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.0