Program received signal SIGSEGV, Segmentation fault.
0x00000008017f52c0 in XmbTextEscapement () from /usr/local/lib/libX11.so.6
(gdb) where
#0 0x00000008017f52c0 in XmbTextEscapement () from /usr/local/lib/libX11.so.6
#1 0x00000000005bb18c in rip_exposed (w=0x8031f5200, client_data=0x0,
widget_data=0x7fffffffc580) at ../win/X11/wintext.c:681
#2 0x000000080154b048 in XtCallCallbacks () from /usr/local/lib/libXt.so.6
#3 0x00000000005a9556 in Redisplay (w=0x8031f5200, event=0x7fffffffc580,
region=0x80306d140) at ../win/X11/Window.c:127
#4 0x00000008015583f5 in SendExposureEvent () from /usr/local/lib/libXt.so.6
#5 0x0000000801558952 in XtDispatchEventToWidget ()
from /usr/local/lib/libXt.so.6
#6 0x0000000801558e4c in _XtDefaultDispatcher ()
from /usr/local/lib/libXt.so.6
#7 0x00000008015580b8 in XtDispatchEvent () from /usr/local/lib/libXt.so.6
#8 0x00000000005b1622 in x_event (exit_condition=2)
at ../win/X11/winmap.c:1842
#9 0x00000000005ba2ed in display_text_window (wp=0x86dfe0, blocking=1 '\001')
at ../win/X11/wintext.c:270
#10 0x00000000005ab708 in X11_display_nhwindow (window=4, blocking=1 '\001')
at ../win/X11/winX.c:801
#11 0x000000000046b9f3 in done (how=0) at end.c:1151
#12 0x0000000000469acb in done_in_by (mtmp=0x80322c9c0) at end.c:317
#13 0x00000000004ade78 in mdamageu (mtmp=0x80322c9c0, n=3) at mhitu.c:2740
#14 0x00000000004ab2d2 in hitmu (mtmp=0x80322c9c0, mattk=0x82a310)
at mhitu.c:2134
#15 0x00000000004a71fe in mattacku (mtmp=0x80322c9c0) at mhitu.c:807
#16 0x00000000004d0159 in dochug (mtmp=0x80322c9c0) at monmove.c:614
#17 0x00000000004cdde6 in dochugw (mtmp=0x80322c9c0) at monmove.c:110
#18 0x00000000004c2de4 in movemon () at mon.c:692
#19 0x0000000000404cba in moveloop () at allmain.c:94
#20 0x000000000059f36d in main (argc=1, argv=0x7fffffffd2c0)
at ../sys/unix/unixmain.c:321
(gdb) up
#1 0x00000000005bb18c in rip_exposed (w=0x8031f5200, client_data=0x0,
widget_data=0x7fffffffc580) at ../win/X11/wintext.c:681
681 int width = XmbTextEscapement(fontset, rip_line[i], len);
(gdb) print width
$1 = 8
(gdb) print len
$2 = 4
(gdb) print fontset
$3 = 0x308cc00
(gdb) print rip_line[i]
$4 = "nabe", '\0' <repeats 12 times>
(gdb) print rip_line
$5 = {"nabe", '\0' <repeats 12 times>,
"100 Au\000\000\000\000\000\000\000\000\000\000", "仔犬に殺された\000\000",
'\0' <repeats 16 times>, '\0' <repeats 16 times>, '\0' <repeats 16 times>,
"2014", '\0' <repeats 12 times>}
(gdb)
cc -pipe -g -I../include -DX11_GRAPHICS -I/usr/local/include -c ../win/X11/wintext.c
../win/X11/wintext.c: In function 'rip_exposed':
../win/X11/wintext.c:679: warning: initialization makes pointer from integer without a cast
JNetHack-3.4.3-0.11 を FreeBSD/amd64 9.1-RELEASE でプレイしています。
これは FreeBSD ports コレクションに入っている ja-nethack-3.4.3_6 ですが、include/config.h で "# define USE_XPM" を手動で有効にして使っています。
X11 版でプレイヤー死亡後、最後に墓石 (rip.xbm) を表示するタイミングで segmentation fault が起きます。
墓石に文字を刻む処理で何かが起きているようです (デバッガの使い方が下手ですいません)。少なくとも文字長 (len) 4 に対して総幅 (width) 8 が戻って来るのはおかしいと思います。
その原因ですが、include/xwindow.h に必要な関数プロトタイプ宣言が抜けているためのようです。上記 XmbTextEscapement() を実行する直前で
としてますが、WindowFontSet() の関数プロトタイプ宣言が無いために、戻り値が正しく扱われていないようです。この部分、コンパイルの段階で以下の warning が出ています。再現する環境ですが、試した限りで FreeBSD 8.4/9.1/9.3/10.0 の amd64 版で再現しました。9.1/9.3 の i386 版では再現しません。
ただし、Vine Linux 6.2.1 (Kernel 3.4.69, gcc-4.4.5) の x86_64 版でも再現しないので (上記 warning も出ない)、64bit 環境ならそうなる、と言い切れるものではないようです。
以下のパッチで再現しなくなりました。FreeBSD ports コレクションには障害報告として同じパッチを投稿しています (先日 commit されました)。