質問をさせてください。
groff が Segmentation Fault で落ちるというトラブルで
頭を悩ませています。どなたか対処方法をご存知の方が
いらっしゃれば教えてください。
元々 groff は、JE からインストールしたものでした。
これが前記トラブルで使えないので、
groff-1.17.2.tar.gz を make しました。
しかし、現象が変わらないので、
http://www.linux.or.jp/JM/man-ja/man-pager.html#jgroff
を参照して、groff をもう一度 make しました。
それでも、現象が変わらないので、今回質問させて頂きました。
宜しくお願い致します。
北陸先端大
情報科学研究科
小林 史陽
Fumiaki> 元々 groff は、JE からインストールしたものでした。
Fumiaki> これが前記トラブルで使えないので、
Fumiaki> groff-1.17.2.tar.gz を make しました。
Fumiaki> しかし、現象が変わらないので、
ええと make のときに cc(gcc) に -g をつけてコンパイルしたり,
リンクしたりして下さい.
つぎに
% gdb ./groff
し,
gdb> run -Tnippoon -mandocj hoge.1
と実行し,
落ちる所を調べます. というのじゃだめなんでしょうか?
今書かれていることだと, あぁ segmentation fault したのね... しかわから
ないのではないですかね.
--
(ishi) env LANG=C groff ... ならおちないとか?
お返事ありがとうございます。
From: Takashi ISHIOKA <ish...@dad.eec.toshiba.co.jp>
Subject: [linux-users:90059] Re: groff の Segmentation Fault について
Date: Fri, 14 Dec 2001 15:54:50 +0900
Message-ID: <o6g3d2e...@eecdkah.dad.eec.toshiba.co.jp>
Fumiaki> groff が Segmentation Fault で落ちるというトラブルで
Fumiaki> 頭を悩ませています。どなたか対処方法をご存知の方が
Fumiaki> いらっしゃれば教えてください。
ishioka> 今書かれていることだと, あぁ segmentation fault したのね...
ishioka> しかわからないのではないですかね.
失礼しました。
ishioka> (ishi) env LANG=C groff ... ならおちないとか?
これは落ちました。
その他に、LANG=ja_JP.ujis でも落ちました。
ishioka> ええと make のときに cc(gcc) に -g をつけてコンパイルしたり,
ishioka> リンクしたりして下さい.
ishioka>
ishioka> つぎに
ishioka> % gdb ./groff
ishioka> し,
ishioka> gdb> run -Tnippoon -mandocj hoge.1
ishioka> と実行し,
ishioka>
ishioka> 落ちる所を調べます. というのじゃだめなんでしょうか?
これについては、今からやってみます。
# ちなみに、上記のリンクは、
# ライブラリ関数の Static リンクを意味しますか?
なお、Solaris で groff をやると、
% groff
と標準入力での wait 状態になるのですが、
Linux では、
% groff
Segmentation Fault
となることから、Source の始めの方のライブラリ関数呼び出しに
問題があるに違いないと踏んでいます。
北陸先端大
情報科学研究科
小林 史陽
Fumiaki Kobayashi <fumi...@jaist.ac.jp>さんは
<200112141643...@jaist.ac.jp>で書きました
> ishioka> ええと make のときに cc(gcc) に -g をつけてコンパイルしたり,
> ishioka> リンクしたりして下さい.
> これについては、今からやってみます。
>
> # ちなみに、上記のリンクは、
> # ライブラリ関数の Static リンクを意味しますか?
man gcc
(snip)
-g Produce debugging information in the operating sys-
tem's native format (stabs, COFF, XCOFF, or DWARF).
GDB can work with this debugging information.
On most systems that use stabs format, `-g' enables
use of extra debugging information that only GDB
can use; this extra information makes debugging
work better in GDB but will probably make other de-
buggers crash or refuse to read the program. If
you want to control for certain whether to generate
the extra information, use `-gstabs+', `-gstabs',
`-gxcoff+', `-gxcoff', `-gdwarf+', or `-gdwarf'
(see below).
---
加藤 丈明
富士通(株) IAサーバ事業部 第一技術部
TEL: 044-754-8332 内線: 7112-4775
FAX: 044-754-8358 内線: 7112-0753
e-mail:ka...@csd2.cs.fujitsu.co.jp
しません. static にせよ dynamic にせよです.
Fumiaki> % groff
Fumiaki> Segmentation Fault
ldd ./groff したら なんかない or 見てはいかんもの見てるんじゃないかなぁ...
あまりあたらしくないですけど...
% groff -v
GNU troff version 1.10 (jversion 0.99)
% ldd `which groff`
libstdc++.so.2.9 => /usr/lib/libstdc++.so.2.9 (0x4001b000)
libm.so.6 => /lib/libm.so.6 (0x4005e000)
libc.so.6 => /lib/libc.so.6 (0x4007b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
c++ なのか...
ためしに libc5 なしすてむに libc6 な groff をもっていってみたら 落ちま
した. libstdc++ いがいは libc6 もはいってたのですが...
# ま むちゃくちゃしてるので 理由は追求しません.
% /tmp/groff
Segmentation fault
ldd すると
libstdc++.so.2.8 => /usr/lib/libstdc++.so.2.8 (0x40004000)
libm.so.6 => /lib/libm.so.6 (0x40047000)
libc.so.6 => /lib/libc.so.6 (0x40060000)
libm.so.5 => /lib/libm.so.5 (0x40107000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
と 楽しい結果です. (stdc++ は同じのなかったんで binary editor でいじり
ました:-)
--
(ishi) なんとなく必要なものが入ってないように見えますね.
From: Fumiaki Kobayashi <fumi...@jaist.ac.jp>
Subject: [linux-users:90060] Re: groff の Segmentation Fault について
Date: Fri, 14 Dec 2001 16:44:03 +0900
Message-ID: <200112141643...@jaist.ac.jp>
ishioka> ええと make のときに cc(gcc) に -g をつけてコンパイルしたり,
ishioka> リンクしたりして下さい.
ishioka>
ishioka> つぎに
ishioka> % gdb ./groff
ishioka> し,
ishioka> gdb> run -Tnippoon -mandocj hoge.1
ishioka> と実行し,
ishioka>
ishioka> 落ちる所を調べます. というのじゃだめなんでしょうか?
結果:
=================================================================
>gdb groff
(gdb) break main
Breakpoint 1 at 0x8000f49: file groff.cc, line 104.
(gdb) run
Starting program: /home/freesoft/groff-1.10/groff/groff
Breakpoint 1, main (argc=1, argv=0xbffff8e4) at groff.cc:104
104 program_name = argv[0];
(gdb) step
106 setbuf(stderr, stderr_buf);
(gdb) step
Program received signal SIGSEGV, Segmentation fault.
0x400855b1 in buf.2 ()
=================================================================
groff.cc:
=================================================================
int main(int argc, char **argv)
{
program_name = argv[0]; <-------- 104 行目
static char stderr_buf[BUFSIZ];
setbuf(stderr, stderr_buf);
assert(NCOMMANDS <= MAX_COMMANDS);
string Pargs, Largs, Fargs;
--snip--
=================================================================
よって、setbuf() 関数を実行中に
SIGSEGV シグナルを受けているようです。
From: Takashi ISHIOKA <ish...@dad.eec.toshiba.co.jp>
Subject: [linux-users:90062] Re: groff の Segmentation Fault について
Date: Fri, 14 Dec 2001 16:57:28 +0900
Message-ID: <o6gy9k6...@eecdkah.dad.eec.toshiba.co.jp>
ishioka> % ldd `which groff`
ishioka> libstdc++.so.2.9 => /usr/lib/libstdc++.so.2.9 (0x4001b000)
ishioka> libm.so.6 => /lib/libm.so.6 (0x4005e000)
ishioka> libc.so.6 => /lib/libc.so.6 (0x4007b000)
ishioka> /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
こちらの方でもやってみました。
>ldd ./groff
libstdc++.so.26 => /usr/lib/libstdc++.so.26 (0x4000a000)
libm.so.5 => /lib/libm.so.5 (0x4003b000)
libc.so.5 => /lib/libc.so.5 (0x40044000)
>nm /lib/libc.so.5 | grep setbuf
0003fc00 T _IO_default_setbuf
0003e3b0 T _IO_file_setbuf
00041560 T _IO_setbuffer
0004ad50 T setbuf
00041560 W setbuffer
で、libc.so.5 に、setbuf() が定義されていることを確認できました。
すると、libc.so.5 が悪いのかと思ったのですが、
README.jp:(groff-1.10.tar.gz 付属)
====================================================================
◎ インストール
以下の環境でmake出来ることを確認しています。
☆ FreeBSD 2.1.0-RELEASE
XFree86-3.1.2, gcc 2.6.3
☆ GNU/Linux 0.93R6 (Kernel 1.3.43, libc-5.2.14) ←ここ
XFree86-3.1.2, gcc 2.7.1, libg++-2.7.1
☆ NEC EWS/4800/310
SVR4.2 Release9.1 Rev.B, X11R5, gcc 2.6.0
====================================================================
libc-5 でもいいはずなんですよね…。
ちなみに、
%ls -l /lib/libc.so.5
lrwxrwxrwx 1 root root 14 Sep 1 1997 /lib/libc.so.5 -> libc.so.5.4.23*
です。
何かアドバイスがあればお願いします。
北陸先端大
情報科学研究科
小林 史陽
>> ldd ./groff
Fumiaki> libstdc++.so.26 => /usr/lib/libstdc++.so.26 (0x4000a000)
Fumiaki> libm.so.5 => /lib/libm.so.5 (0x4003b000)
Fumiaki> libc.so.5 => /lib/libc.so.5 (0x40044000)
ええと 私が持ち歩いている環境は libc5 です. いまだに.
% groff -v
GNU troff version 1.10 (jversion 0.99)
-rwxr-xr-x 1 bin bin 1427975 Jun 21 1998 /lib/libc.so.5.4.46
-r-xr-xr-x 1 root root 394044 May 16 1998 /usr/lib/libstdc++.so.2.8.0
% gcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.2.3/specs
gcc version 2.7.2.3
Fumiaki> libc-5 でもいいはずなんですよね…。
ま, 私のとこでは 動いています.
でも libc とかは ずずーと新しいですが.
libc5 もっとあたらしいのを もってきて(install はしないで...)
LD_PRELOAD とか駆使して 動かしてみるかなぁ...
# それで他も問題ないなら 入れ替える.
--
(ishi) Plamo Linux 1.x base です.
いま 1.17.2 とかいうの make してみてますけど...
うごきますね... こっちだと.
From: Takashi ISHIOKA <ish...@dad.eec.toshiba.co.jp>
Subject: [linux-users:90065] Re: groff の Segmentation Fault について
Date: Fri, 14 Dec 2001 19:18:05 +0900
Message-ID: <o6gsnae...@eecdkah.dad.eec.toshiba.co.jp>
ishioka> ま, 私のとこでは 動いています.
ishioka> でも libc とかは ずずーと新しいですが.
ishioka> libc5 もっとあたらしいのを もってきて(install はしないで...)
ishioka> LD_PRELOAD とか駆使して 動かしてみるかなぁ...
ishioka> # それで他も問題ないなら 入れ替える.
ishioka>
ishioka> いま 1.17.2 とかいうの make してみてますけど...
ishioka> うごきますね... こっちだと.
いしおかさん、いろいろやってもらって
どうもありがとうございました。
libstdc++ あたりから make をやってみます。
# そのためには、gcc の make をやらなくちゃいけないのですが、
# 問題は Disk Space だったりするんだよなぁ…。はぁ。(ため息)
というわけで、もし動かすことに成功したら、
こちらに報告させてもらいます。
お騒がせしました。ぺこり m(_ _)m
PS.
おまけとして、もう1通メールを投げます。
北陸先端大
情報科学研究科
小林 史陽
おまけです。
From: Fumiaki Kobayashi <fumi...@jaist.ac.jp>
Subject: [linux-users:90063] Re: groff の Segmentation Fault について
Date: Fri, 14 Dec 2001 18:04:47 +0900
Message-ID: <200112141804...@jaist.ac.jp>
fumiakik> 結果:
fumiakik> =================================================================
fumiakik> >gdb groff
fumiakik> (gdb) break main
fumiakik> Breakpoint 1 at 0x8000f49: file groff.cc, line 104.
fumiakik> (gdb) run
fumiakik> Starting program: /home/freesoft/groff-1.10/groff/groff
fumiakik>
fumiakik> Breakpoint 1, main (argc=1, argv=0xbffff8e4) at groff.cc:104
fumiakik> 104 program_name = argv[0];
fumiakik> (gdb) step
fumiakik> 106 setbuf(stderr, stderr_buf);
fumiakik> (gdb) step
fumiakik>
fumiakik> Program received signal SIGSEGV, Segmentation fault.
fumiakik> 0x400855b1 in buf.2 ()
fumiakik> =================================================================
fumiakik>
fumiakik> groff.cc:
fumiakik> =================================================================
fumiakik> int main(int argc, char **argv)
fumiakik> {
fumiakik> program_name = argv[0]; <-------- 104 行目
fumiakik> static char stderr_buf[BUFSIZ];
fumiakik> setbuf(stderr, stderr_buf);
fumiakik> assert(NCOMMANDS <= MAX_COMMANDS);
fumiakik> string Pargs, Largs, Fargs;
fumiakik> --snip--
fumiakik> =================================================================
fumiakik>
fumiakik> よって、setbuf() 関数を実行中に
fumiakik> SIGSEGV シグナルを受けているようです。
試しに、この setbuf() をコメントアウトして make したものを
Debug してみました。結果は、無事に 107 行目を迎えましたが、
別のところで、Segmentation Fault をしました。
一応報告しておきます。
それから、以下、後学のためにも、是非お教えください。
From: Takashi ISHIOKA <ish...@dad.eec.toshiba.co.jp>
Subject: [linux-users:90059] Re: groff の Segmentation Fault について
Date: Fri, 14 Dec 2001 15:54:50 +0900
Message-ID: <o6g3d2e...@eecdkah.dad.eec.toshiba.co.jp>
ishioka> ええと make のときに cc(gcc) に -g をつけてコンパイルしたり,
ishioka> リンクしたりして下さい.
↑
ここでいうリンクとは何ですか?
宜しくお願いします。
北陸先端大
情報科学研究科
小林 史陽
On Fri, 14 Dec 2001 20:53:18 +0900
Fumiaki Kobayashi <fumi...@jaist.ac.jp> wrote:
> fumiakik> よって、setbuf() 関数を実行中に
> fumiakik> SIGSEGV シグナルを受けているようです。
man setbufすると,
>setbuffer 関数および setlinebuf 関数は 4.2BSD より前の BSD とは互換性がない。
>また Linux でも(古いバージョンでは)利用できないかもしれない。4.2BSD およ
>び 4.3BSD のシステムでは setbuf は必ず追加のバッファーのサイズを使用する
>ので、これも使うべきでない。
とあります。ちょっと意味が分かりませんが不安気な言葉が。
ちなみに,setbufの行を
setvbuf( stderr, stderr_buf, _IOFBF, BUFSIZ);
と変更してみたらどうなりますか?
かわた まさひろ
>> On Fri, 14 Dec 2001 20:53:18 +0900, Fumiaki Kobayashi <fumi...@jaist.ac.jp> said:
ishioka> ええと make のときに cc(gcc) に -g をつけてコンパイルしたり,
ishioka> リンクしたりして下さい.
Fumiaki> ↑
Fumiaki> ここでいうリンクとは何ですか?
まぁ あまり深い意味はなくて... コンパイルというのを .o をつくるまで,
.o と その他諸々をくっつけて 実行形式を作るのを リンクとよんでいるのです.
ご参考...
#include <stdio.h>
int main(int artgc, char **argv)
{
printf("Hello world\n");
exit(0);
}
これを hello.c に 保存して...
% cc -g -v -o hello hello.c
:
/usr/lib/gcc-lib/i386-pc-linux/2.95.2/cpp -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -g -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ hello.c /tmp/ccpmjcEr.i
ここで, プリプロセッサが動いて...
/usr/lib/gcc-lib/i386-pc-linux/2.95.2/cc1 /tmp/ccpmjcEr.i -quiet -dumpbase hello.c -g -version -o /tmp/ccvoBSRv.s
ここで コンパイル.
/usr/i386-pc-linux/bin/as -V -Qy -o /tmp/ccfZkFJn.o /tmp/ccvoBSRv.s
アセンブラが動いて, .o を作ります.
/usr/lib/gcc-lib/i386-pc-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i386-pc-linux/2.95.2/crtbegin.o -L/usr/lib/gcc-lib/i386-pc-linux/2.95.2 -L/usr/i386-pc-linux/lib /tmp/ccfZkFJn.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-pc-linux/2.95.2/crtend.o /usr/lib/crtn.o
.o と 実行に必要なライブラリやらスタートアップを「リンク」して
実行形式 hello ができあがり.
# 中で ld というリンカを呼んでいます.
--
(ishi) 中でもいろいろやってるということ.