2005年07月19日

Windowsのスタイル変更が原因でSWTが落ちる

SWTを使ってアプリを作成していて変な現象が発生したのでそのメモ。

昨日まで動いていたアプリが今日動かなくなった。例外のスタックトレースは以下の通り。
Exception in thread "main" org.eclipse.jface.text.Assert$AssertionFailedException: Assertion failed:
at org.eclipse.jface.text.Assert.isTrue(Assert.java:177)
at org.eclipse.jface.text.Assert.isTrue(Assert.java:162)
at org.eclipse.jface.text.source.LineNumberRulerColumn.getBaselineBias(LineNumberRulerColumn.java:812)
at org.eclipse.jface.text.source.LineNumberRulerColumn.doPaint(LineNumberRulerColumn.java:688)
・・・・以下略

どうもStyledTextの行番号を表示するRulerの部分で落ちているようだ。
確かにRulerを表示しないようにするとちゃんと動く。
同じコードで別のマシンに持って行くとちゃんと動く。

動いていた状態から変更したと言えばWindowsのスタイルを変更したぐらいだ。
うそーん、と思いつつ原因を調べることに。

スタックトレースからLineNumberRulerColumn.javaの812行目でアサートに失敗しているのでとりあえずEclipseのソースをCVSから取得。

すると「1行の高さよりフォントの高さの方が小さい事」、とAssertしていた。
う~ん、これが原因か。
確かにスタイルを変更するとエディタ部分のフォントがMS ゴシック以外のフォントになってしまっていたがこれがダメなのか。
そしてそのWindowsスタイルのフォントにはtahomaが設定されていた。

もしかしたら、テキスト描画の縦幅を計算するときは英語のtahomaフォントを使用して、日本語を描画するときは別の日本語フォントが自動で選択されたためにフォントの設定に差異が生じてバグっていたのかもしれない。
とりあえずWindowsのスタイル設定で使用するフォントをすべてtahomaからMS Pゴシックに変更するとエラーが出なくなった。すばらしい。


問題が起こったときに原因を自分で調べることができる。オープンソースバンザイ。

でもクライアントのフォントの設定によって動いたり動かなかったりするアプリはまずいよなぁ。
まぁWindowsにわざわざパッチ当ててスタイル変更できるようにする人は少ないから問題ないか。
それに変なフォント入れてなければ普通にMS ゴシックが使われるからエラーにならないし。
ちなみにこのAssertはjface独自で実装されたAssertなのでjavaオプションでAssertをオフにしてもこのAssertを無効にすることはできなかった。

Trackback on "Windowsのスタイル変更が原因でSWTが落ちる"

このエントリーのトラックバックURL: 

"Windowsのスタイル変更が原因でSWTが落ちる"へのトラックバックはまだありません。

Comment on "Windowsのスタイル変更が原因でSWTが落ちる"

"Windowsのスタイル変更が原因でSWTが落ちる"へのコメントはまだありません。