読者です 読者をやめる 読者になる 読者になる

XSお勉強メモ2「gdbを使ってみる」

perl gdb

gdbを使ってList::UtilのXS部分を見てみる手順。
List::Util::XS - search.cpan.org

Makefile.PLの編集とコンパイル

WriteMakefile()に「OPTIMIZE => '-g'」を追加。

perl Makefile.PL
make

で、コンパイル。

実行

下記のコマンドで、gdbを使いつつList::Util::minを呼び出します。

gdb --args perl -Mblib -MList::Util -e "print List::Util::min(10,3,9)"


(gdb)というプロンプトが出たら、関数名を指定してブレークポイントを設定します。

(gdb) break XS_List__Util_min
Function "XS_Foo__Bar_min" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y


下記のコマンドでプログラムを実行するとブレークポイントまで走って止まります。

(gdb) run
Starting program: /Users/memememomo/perl5/perlbrew/bin/perl -Mblib -MList::Util -e print List::Util::min\(10,3,9\)
Reading symbols for shared libraries ++.. done
Reading symbols for shared libraries . done
Reading symbols for shared libraries . done
Breakpoint 1 at 0x1001bbb6d: file ListUtil.c, line 200.
Pending breakpoint 1 - "XS_List__Util_min" resolved

Breakpoint 1, XS_List__Util_min (cv=0x1008609e8) at ListUtil.c:200
200 dVAR; dXSARGS;
(gdb)

ステップ実行と変数の中身を見る

ステップ実行は「n」を入力する事で行なえます。

(gdb) n
204 dXSI32;
(gdb) n
147 if(!items) {
(gdb) n
150 retsv = ST(0);


変数の中身を見るには「p (変数名)」を使います。

(gdb) p items
$1 = 3
(gdb) p retsv
$2 = (SV *) 0x10015e4c0
(gdb) p *retsv
$3 = {
sv_any = 0x0,
sv_refcnt = 0,
sv_flags = 0,
sv_u = {
svu_pv = 0x1008030a8 "H|#",
svu_iv = 4303368360,
svu_uv = 4303368360,
svu_rv = 0x1008030a8,
svu_array = 0x1008030a8,
svu_hash = 0x1008030a8,
svu_gp = 0x1008030a8
}
}
(gdb) p ix
$4 = 0

という感じで。