From: Masao M. <mu...@hi...> - 2005-01-30 16:07:47
|
むとうです。 On Sun, 30 Jan 2005 04:12:52 +0900 Masao Mutoh <mu...@hi...> wrote: > 須藤さん > > むとうです。 > > GnomePrintのテストプログラムがこけるようです。 > もしかしたら私がextconf.rbを変更しちゃったのが > 原因かもしれません。その辺は明日にでも確認します > が、念のため、ご報告まで。 > 1) Error: > test_line_to(TestContext): > RuntimeError: GnomePrint-CRITICAL **:file gnome-print-stdapi.c: line 390 (gnome_print_lineto): assertion `pc->haspage' failed > ./test/test_context.rb:16:in `line_to' > ./test/test_context.rb:16:in `test_line_to' こちらですが、Ruby/GLibのログハンドラが例外をあげることが 問題ということで、Ruby/GLib側を修正しました。 元々、GLibのMessage Loggingの機能を使おうと考えた理由を 備忘録としてここにメモしておきます。 各GNOMEライブラリがエラーを出力する際に、エラーメッセージを 出力するのですが、その内容が GnomePrint-CRITICAL **:file gnome-print-stdapi.c: line 390 (gnome_print_lineto): assertion `pc->haspage' faile という感じで、Rubyスクリプトからはスクリプトのどこが 悪いのか、わかりづらいものでした。 上記の例では、gnome_print_linetoを見て、Gnome::Print#linetoに 問題があるんだろうな、と判断できる幸運な例の一つですがそれにしても 同じメソッドが何回も呼び出されている場合は実際どこの行で発生したか 問題を追うのに一苦労すると思います。 そこで、そのログ出力時に例外をあげてしまえば、Rubyスクリプトのどの 行でエラーがあがったのか分かるだろう、と考え、そのような実装に していました。実装はglib/src/rbglib_messages.cのrbglib_log_handler() という関数です。 経緯と実装したい機能としては以上です。 で、今回のような問題やRuby/GnomeCanvasでこれが原因でsegfault が発生することについては考えてませんでした。 そこで、今回の変更では、メッセージは$VERBOSEと、ruby自体が終了する 際の微妙なタイミングのエラー(ほぼメモリ解放がらみのエラーと思われます) のときのみ、標準エラー出力にRubyのソースコードのファイル名と行数を 出力するようなものにしました。 デバッグするときはRubyの起動オプションで-d, -wといったオプションをつける 必要があります。 -dをつけたときの出力メッセージは以下のようになります。 ./test/test_context.rb: line 7 GnomePrint-CRITICAL **:file gnome-print-stdapi.c: line 390 (gnome_print_lineto): assertion `pc->haspage' failed 最初にスクリプト名と行番号が出るのでデバッグもしやすかろうと言うことです。 #「ruby自体が終了する際の微妙なタイミングのエラー」では、 #スクリプト名も行番号も出ずに今まで通りのメッセージが出力されます。 もし、ほかによいアイデアやこの機能に関するご意見がありましたら 教えてください。 それでは。 -- .:% Masao Mutoh<mu...@hi...> |