Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

groff の Segmentation Fault について

112 views
Skip to first unread message

Fumiaki Kobayashi

unread,
Dec 14, 2001, 1:24:51 AM12/14/01
to
はじめまして、小林と申します。

質問をさせてください。

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 しました。
それでも、現象が変わらないので、今回質問させて頂きました。

宜しくお願い致します。


北陸先端大
情報科学研究科

小林 史陽

Takashi ISHIOKA

unread,
Dec 14, 2001, 1:54:50 AM12/14/01
to linux...@linux.or.jp
Fumiaki> groff が Segmentation Fault で落ちるというトラブルで
Fumiaki> 頭を悩ませています。どなたか対処方法をご存知の方が
Fumiaki> いらっしゃれば教えてください。

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 ... ならおちないとか?

Fumiaki Kobayashi

unread,
Dec 14, 2001, 2:44:03 AM12/14/01
to linux...@linux.or.jp
こんにちは、小林です。

お返事ありがとうございます。

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 の始めの方のライブラリ関数呼び出しに
問題があるに違いないと踏んでいます。

北陸先端大
情報科学研究科

小林 史陽

Takeaki Kato

unread,
Dec 14, 2001, 2:57:20 AM12/14/01
to linux...@linux.or.jp
加藤です。

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

Takashi ISHIOKA

unread,
Dec 14, 2001, 2:57:28 AM12/14/01
to linux...@linux.or.jp
Fumiaki> # ちなみに、上記のリンクは、
Fumiaki> # ライブラリ関数の Static リンクを意味しますか?

しません. 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) なんとなく必要なものが入ってないように見えますね.

Fumiaki Kobayashi

unread,
Dec 14, 2001, 4:04:47 AM12/14/01
to
こんにちは、小林です。

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*

です。


何かアドバイスがあればお願いします。

北陸先端大
情報科学研究科

小林 史陽

Takashi ISHIOKA

unread,
Dec 14, 2001, 5:18:05 AM12/14/01
to linux...@linux.or.jp
いしおかです.

>> 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 してみてますけど...
うごきますね... こっちだと.

Fumiaki Kobayashi

unread,
Dec 14, 2001, 6:44:13 AM12/14/01
to
こんにちは、小林です。

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通メールを投げます。

北陸先端大
情報科学研究科

小林 史陽

Fumiaki Kobayashi

unread,
Dec 14, 2001, 6:53:18 AM12/14/01
to
こんにちは、小林です。

おまけです。

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> リンクしたりして下さい.

ここでいうリンクとは何ですか?


宜しくお願いします。

北陸先端大
情報科学研究科

小林 史陽

Masahiro Kawata

unread,
Dec 14, 2001, 9:22:27 AM12/14/01
to
はじめまして,かわたと申します。
参考になればいいんですが。

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);

と変更してみたらどうなりますか?

かわた まさひろ


Takashi ISHIOKA

unread,
Dec 16, 2001, 7:38:19 PM12/16/01
to linux...@linux.or.jp
いしおかです.

>> 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) 中でもいろいろやってるということ.

0 new messages