Re: xdvi のデバッグ (Re: ptetex3 on Ubuntu-ja5.10)

名前: 土村
日時: 2005-10-20 13:37:10
IPアドレス: 133.11.136.*

>>38699 報告ありがとうございます。 xdvi のバグ探しと言うより、 gdb の使い方講座になってしまいそうで恐縮ですが、 ともかく追跡のしかたを書いてみます。 # setup_signal_handlers() をコメントにしなくても、 # ちゃんと core を吐いてくれました。すいません。 $ tar xzvf ptetex3-20051003.tar.gz $ cd ptetex3-20051003 $ make tmp $ make tmpfont $ cd /var/tmp/src/tetex-src-3.0/texk/xdvik/ $ vi dvi-draw.c ← 今回はわざとエラーを埋め込んだ $ make install bash なら $ export PATH=/var/tmp/teTeX/bin:$PATH $ ulimit -c 10000 tcsh なら $ setenv PATH /var/tmp/teTeX/bin:$PATH $ limit coredumpsize 10000 $ which platex ← PATH がちゃんと通ったことを確認 /var/tmp/teTeX/bin/platex $ platex209 sample.tex $ xdvi sample.dvi セグメンテーション違反です (core dumped) $ gdb xdvi-motif.bin core.* ... (gdb) where ← bt でも同じ #0 0x403eec11 in kill () at finddomain.c:145 #1 0x403ee895 in raise (sig=6) at ../linuxthreads/sysdeps/unix/sysv/linux/raise.c:32 #2 0x403f0008 in abort () at ../sysdeps/generic/abort.c:88 #3 0x0807dce4 in expand_homedir (path=0x3039 <Address 0x3039 out of bounds>) at util.c:442 #4 <signal handler called> #5 __libc_free (mem=0x10) at malloc.c:3341 #6 0x08050084 in rotate_bitmap (bm=0x84170e4) at dvi-draw.c:1376 #7 0x08050f41 in set_char_rotate_glyph (g=0x84170d8, reverse_rotate=0) at dvi-draw.c:2213 #8 0x08050ee1 in set_char (ch=84) at dvi-draw.c:2197 #9 0x08058e38 in set_t1_char (ch=84) at dvi-draw.c:6685 ..... (gdb) frame 6 ← rotate_bitmap() に着目したいので "#6" の 1を入力 #1 0x08050084 in rotate_bitmap (bm=0x84170e4) at dvi-draw.c:1376 1376 free(bm->bits); (gdb) list ← 周辺のソースを表示(dvi-draw.c:1376 に着目) 1371 else m1 >>= 1; 1372 #endif 1373 } 1374 1375 bm->bits = 12345; ← エラーを起こすためわざと追記した 1376 free(bm->bits); 1377 *bm = new_bm; 1378 } 1379 1380 (gdb) print bm->bits ← 怪しい変数を表示してみる $1 = 0x3039 <Address 0x3039 out of bounds> こうやって追跡します。0x3039 = 12345 で、 犯人が見つかったことになります。 代入されてるはずもないのに、変数の値が書き変わっているとしたら、 おそらくはポインタ操作を誤っているとか、 関数プロトタイプ宣言が間違っているとか、 非常に厄介な問題を抱えていることでしょう。 栗山さんのログでも free() で落ちてますが、 その前の set_char_rotate_glyph() の 引数の reverse_rotate の値が Variable "reverse_rotate" is not available. となって表示されてないのが気になります。 コンパイル時に警告は出てないでしょうか。 ポインタのキャストとかプロトタイプ宣言がないとか。 "dereferencing type-punned pointer will break strict-aliasing rules" はそれほど大きな問題にはならないと思います。 (xdvi-jp の最新版では修正しています。) "代入により、キャストなしで整数からポインタを作りました" は、立派なバグですので、そこを直せばよいかもしれません。

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)