mendexのコンソール出力が変になる

Re: mendexのコンソール出力が変になる

- 井汲 景太 の投稿
返信数: 7
検証ありがとうございました。端末の種類や状態にもよるかもしれない現象なのですね。

私の所では、X window の mate デスクトップ環境で、kterm 上で tcsh を使っています。和田さんと違って、X11上で表示がおかしくなっています。
mate, kterm は FreeBSD のバイナリパッケージ pkg で導入したもので、kterm は X resource で日本語コードを EUC にして使っています。tcsh は FreeBSD に付属のものです。

stty all の出力は次の通りです。
speed 9600 baud; 42 rows; 80 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
        -echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
        -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff -ixany -imaxbel -ignbrk
        -brkint -inpck -ignpar -parmrk
oflags: opost onlcr -ocrnl tab0 -onocr -onlret
cflags: cread cs8 parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
        -dtrflow -mdmbuf
discard dsusp   eof     eol     eol2    erase   erase2  intr    kill    
^O      ^Y      ^D      <undef> <undef> ^H      ^@      ^C      ^U      
lnext   min     quit    reprint start   status  stop    susp    time    
^V      1       ^\      ^R      ^Q      ^@      ^S      ^Z      0       
werase  
^W      

関係あるかもしれない環境変数の値をいくつか挙げます。
LANG=ja_JP.eucJP
TERM=kterm-color
TERMCAP=kterm-color|kterm-co:pa#64:Co#8:AF=\E[3%dm:AB=\E[4%dm:op=\E[39;49m:hs:es:ts=\E[?E\E[?%i%dT:fs=\E[?F:ds=\E[?H:KJ:sc=\E7:rc=\E8:cs=\E[%i%d;%dr:TY=ascii:eA@:as=\E(0:ae=\E(B:am:bs:km:mi:ms:pt:xn:co#80:kn#20:li#24:*6=\E[4~:@0=\E[1~:@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:ct=\E[3g:dc=\E[P:dl=\E[M:ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:md=\E[1m:me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:rs=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:se=\E[m:sf=^J:so=\E[7m:sr=\EM:ue=\E[m:up=\E[A:us=\E[4m:

LANG 以外に locale 関連の環境変数は設定していません。

mendbug.ilg の内容はこうです。
This is mendex version 2.6f [14-Aug-2009] (euc) (TeX Live 2016).
Scanning dictionary file ./mendbug.dic....done.
Scanning input file mendbug.idx.
Error: 愛上尾 is no entry in dictionary file in mendbug.idx, line 1....done (0 e
ntries accepted, 1 rejected).
0 entries accepted, 1 rejected.
1 errors, written in mendbug.愛上尾.
Nothing written in output file.

当該の現象が起きているスクリーンショットを添付します。

追記: bash や fish に切り替えてみても同じ現象が起きました。
添付 screenshot.png
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
FreeBSD インストール時に kde 入れたんだけど startx するとほぼ素の X 恥ずかしいなので こちらは xterm でした 恥ずかしい
Xを終了させ コンソール で試すこと可能ですか?

また kterm 上で truss でシステムコールの状況はどうでしたか?おそらく mendbug. が一バイトづつ出力されたその後に愛上尾に相当する六バイト分が出力されると思います。お時間があればチェックして見てください。

今までの情報では「愛上尾」の文字列が .dic ファイルによる影響だというように受け取っていたのですが、添付の画像から判断すると .idx を読み込んだ情報が紛れ込んだように思いますので明日この点を踏まえて再度ソースを追いかけて見ます。

さて ... まだ原因はわかりません 悲しい ので中間報告

ソースは CTAN から 2016 にリリースした際と思われる texlive-20160523-source.tar ファイルのものを展開して調査しています。

実験して判明したこと。

1) texlive 2016 のソースから rebuild した mendex では問題のゴミは発生しないように思えますが、リビルド方法に問題があるかどうか検討中。デバッグオプション -g 付きとそうでないもの両方出力されません。truss でも出ません。

# rebuild に問題があるのか本格的な symbolic debug は未到達 悲しい

2) texlive 2017 向けのソースだと Error: 愛上尾 自体も以下のように出力されません。(こちらは rsync でカレントを引張てきました)

この上に path 関連の警告メッセージ
This is mendex version 2.6f [14-Aug-2009] (euc) (TeX Live 2017).
Scanning dictionary file ./mendbug.dic....done.
Scanning input file mendbug.idx.
Warning: Incomplete first argument in mendbug.idx, line 1....done (0 entries accepted, 0 rejected).
0 entries accepted, 0 rejected.
Nothing written in output file.

2016 との違いは ... スタイルファイルの読み込み場所を変えている、ファイルの読み込みを fgets から mfgets に置き換えているのでその影響?かそれともrebuild 方法に問題があるか検討中。


truss であのような壊れ方(?)をしているように見えるのでどこかにバファーオーバランなどがあるのではと思いつつ問題となった文字列を出したであろう変数を中心に追跡。アスキーさんの原作では配列でしたが xstrdup などの関係から pointer にしているようなのでその辺を中心に追いかけたのですが悪さをするようなコーディングは今の所発見できていません。というのでシステムライブラリも検討の範囲にすべく 2016 を作成した時の FreeBSD のバージョンなどの手がかりも調べているのですが、手持ちの材料だけでは不明です。



和田 勇 への返信

Re: mendexのコンソール出力が変になる

- aminophen の投稿
> mendex の 2016 と 2017 の違い

参考までに,ソースコードレベルの違いについては

「style file 読み込みのタイミングを遅らせた」
→ エラー・警告を出すタイミングで efp が初期化されていないことにより
segmentation fault が発生していたのを修正するため.

「ファイルの読み込みを fgets から mfgets に置き換え」
→ win32 で文字コード推測機能(nkf ベースのコードを ptexenc に含ませて
いる)を sty file 読込にも適用するため.

です.
aminophen への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
アセト アミノフェンさん、解説ありがとうございます。
texlive-yyyymmdd-source/README.2building を参考にして

mkdir texlive-yyyymmdd-source/Work
cd texlive-yyyymmdd-source
../configure --disable-all-pkgs --enable-mendexk -C CFLAGS=-g CXXFLAGS=-g

のようにして rebuild したのですが手順等に不手際があれば教えてください。
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
それから 2016 リリース用を作成した時の FreeBSD の OS バージョンがわかれば教えてください。
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 井汲 景太 の投稿
> Xを終了させ コンソール で試すこと可能ですか?
Xを終了させるのではなく、Alt+Ctrl+F1 で virtual console に切り替えて試してみました。結果は、「愛上尾」部分がカットされたような出力になりましたが、これはおそらく FreeBSD の virtual console が MSB がオンのバイトの出力を捨てているからそう見えるのだと思います。出力をリダイレクトしてファイルに落とすと、やはり拡張子が「愛上尾」になっていました。

> kterm 上で truss でシステムコールの状況はどうでしたか?
truss というのは知らなかったのですが、調べたいコマンドをまるっとそのまま引数に与えて実行するだけで色々解析してくれるお手軽なツールみたいですね。和田さんの推測通り、上の方で和田さんが引用していたのと同じ出力が得られました。kterm と virtual console 上で truss -o OUTPUTFILE mendex -E ... を実行して得られた結果を添付します。

(以下余談)
> startx するとほぼ素の X なので こちらは xterm でした
KDM 等を使わずに startx で X を始める使い方だと、.xnitrc の最後で startkde を呼ばないと KDE は始まってくれずに素の X になってしまうんじゃないかと思います。少なくとも、数年前に FreeBSD 上で KDE を使ってた時はそうでした。
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
0)ゴミが混入するのに .ilg のファイルに書き込まれているのは、ファイル名の変数は open の時に使用するだけで以降はその時割り当てられたファイルポインタを使うので、今回のような障害がおきても所定のファイルに書き込めているのだと思います。(ソースは見ていませんが)

ニコラスさんからのサジェスションです。もしゴミが気になるなら -t ログファイル とログファイルを明示したらどうでしょうかとのこと。

以下は閑話休題です。

1)そうか virtual console も使えるんだった。通常は6つくらい動いていますしね。
2)linux だとちょっと違うけど strace とかのトレースプログラムを使います。
実行中のプロセスもキャッチアップトレースできますし。
mac は dtrussらしいのだが思い通りの結果が出てこない :-( 修行が足りないので使い方が悪いだけ。solaris も同様だったかな。
3) そういえばちょっと前に CentOS 7 の gnome3 / gnome classic / kde / 他の切り替えでご指摘のことやったのを思い出しました。