vine-users ML アーカイブ



[vine-users:050348] Electric Fence 紹介 (Re: TeX のヴァージョン表示ができません?)

  • From: tutimura@xxxxxxxxxxxxxx
  • Subject: [vine-users:050348] Electric Fence 紹介 (Re: TeX のヴァージョン表示ができません?)
  • Date: Sun, 12 May 2002 17:35:39 +0900
  土村です。

From: Hideya Hane <wing@xxxxxxxx>
Subject: [vine-users:050340] Re: TeX のヴァージョン表示ができません?
Date: Sun, 12 May 2002 14:55:25 +0900 (JST)
Message-ID: <20020512.145525.26300706.wing@xxxxxxxx>

wing>  From: Haruhiko Okumura <okumura@xxxxxxxxxxxxxxxxx>
wing>  Date: Sun, 12 May 2002 08:12:39 +0900 (JST)
wing> 
okumura> うちでは自分で make したものについては再現せず,Vine のだけで起こるの
okumura> で不思議に思っていました。コンパイラが違うためかもしれませんね。
wing> 
wing>   Vine-2.1 から rebuild の gcc-2.95.3-2vl15 に差し
wing> 替えた環境で、tetex-1.0.7-0vl14 を rebuild したも
wing> のでも、問題は再現しませんでした。glibc とかも含め
wing> て、微妙な問題があるのかもしれませんね。

  Vine2.5 標準の gcc でも、
version.c にデバッグライト1行書き加えるだけで
core dump しなくなりました。運次第ということでしょうか。

  こんなことではデバッグできないので、
Electric Fence のお世話になりました。
malloc 関連のデバッグには結構役立ちますので、簡単に紹介してみます。
Vine には標準で入っているようですので、すぐに使えます。
リンクする時の gcc のオプションの最後に -lefence を加えるだけです。

  今回の例を書いてみます。

% apt-get source tetex  <== SRPM を取得します
ファイル依存を処理しています... 完了
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了    
取得パッケージ: 45.3MB のソースアーカイブを取得します。
(省略)
% rpm -ihv tetex-1.0.7-0vl14.src.rpm
tetex                       ##################################################
% cd ~/rpm/SPECS/
% rpm -bc tetex.spec  <== コンパイルします
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.62446
.... (省略)
% cd ../BUILD/teTeX-1.0/texk/web2c/ptex-3.0.1/

./Makefile を編集
-- CFLAGS に "-g" を書き加える。
-- LOADLIBES の最後に "-lefence" を書き加える。

% touch version.c
% make
(省略)
% ./ptex.exe -version   ↓ Electric Fence が動いてる証拠
  Electric Fence 2.0.5 Copyright (C) 1987-1998 Bruce Perens.
セグメントエラー (coreを出力しました)
% gdb ./ptex.exe core.19204  <== 止まった場所を確認します
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
Core was generated by `./ptex.exe -version'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libkpathsea.so...done.
Loaded symbols for /usr/lib/libkpathsea.so
Reading symbols from /lib/libm.so.6...done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0x0807d32f in printversionandexit (
    banner=0x8080ec0 "This is pTeX, Version p3.0.1, based on TeX, Version 3.1415
9", copyright_holder=0x8080eb0 "D.E. Knuth", author=0x0) at version.c:27
27        work_banner[len+1] = 0;  <== 止まった場所が特定できました
(gdb) list  <== ソースの前後を表示させてみる
22      #endif
23      
24        len = strlen(banner);
25        work_banner = xmalloc(len + 1);
26        strcpy(work_banner, banner);
27        work_banner[len+1] = 0;
28      
29        token_start = work_banner;
30        token_end = strchr(token_start, ',');
31        len = token_end - token_start - sizeof("This is");

  こんな具合にデバッグしました。
-----
土村 展之    Nobuyuki Tsuchimura
           tutimura@xxxxxxxxxxxxxx
    http://www.nn.iij4u.or.jp/~tutimura/