-
Notifications
You must be signed in to change notification settings - Fork 43
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Crash with PDF on OS X #79
Comments
@hiroyuki-sato たぶん、PopplerでPDFを処理しているときに例外が発生して、それが誰にも処理されずトップレベルまでいって、Rubyが例外の詳細を出力して、終了するという流れになっていると思います。で、その、最後の終了するところでクラッシュしていると思います。 このクラッシュの仕方だとバックトレースを見れないので、自分でどこでクラッシュしているかを調べていく必要があります。私ならRabbit内に なので、とりあえず、Popplerで該当ファイルを読めるか確認してもらえませんか?以下のコマンドラインの結果を教えて欲しいです。
|
ありがとうございます。 こんな感じになりました。
|
バッチリですね! |
あたりをつけてもらえれば試しますよ。(おそらく)ここから~この間みたいな。 |
ありがとうございます! 例: diff --git a/lib/rabbit/image/pdf.rb b/lib/rabbit/image/pdf.rb
index 92e80f0..0941c24 100644
--- a/lib/rabbit/image/pdf.rb
+++ b/lib/rabbit/image/pdf.rb
@@ -28,6 +28,7 @@ module Rabbit
end
def draw(canvas, x, y, params={})
+ p [__method__, :start]
if @document
default_params = {
:width => width,
@@ -37,6 +38,8 @@ module Rabbit
else
super
end
+ ensure
+ p [__method__, :end]
end
def pixbuf |
ありがとうございます!。時間をとってやってみます。少しお待ちを |
Out of memoryみたいです。 https://gist.github.com/hiroyuki-sato/05a04a0c28f59b27e250#file-gistfile1-txt-L86 cairo: stable 1.14.4 (bottled) |
Backtraceをとってみました。 これでわかりますか?(ちょっと難しそうな気がしていますが...) https://gist.github.com/hiroyuki-sato/05a04a0c28f59b27e250#file-backtrace-txt |
ありがとうございます。
とするとOut of memoryになったところでクラッシュしてくれるかもしれないです。。。 |
いずれにしてもうまくいっていないっぽいのですが https://gist.github.com/hiroyuki-sato/05a04a0c28f59b27e250#file-00lldb_backtrace-txt
参照; https://developer.gnome.org/glib/stable/glib-running.html |
あぁ、すみません。。。 cairoとPopplerをデバッグビルドしてデバッガーで追うしかないですね。。。 まず、エラーメッセージの すると、 http://cgit.freedesktop.org/poppler/poppler/tree/poppler/CairoOutputDev.cc#n199 だけがヒットします。
これを見ると、引数で渡ってきた grepすると
なので、 あとは、どの |
ありがとうございます。試してみます。気長にお待ちを |
ありがとうございます!ムリしない程度でお願いします! |
ここの処理に注目しました。 CairoOutputDev::restoreState ってところで呼び出されるのですが restoreState関数はここしか読んでいないのに、ログがでないのはなんでしょうね? lldbやgdbで、rubyを実行してこのライブラリにブレークポイントって仕掛けられるかご存知でしょうか? |
gdbだと |
OSXでgdbを動かすのに苦労しました。 でやってみたのですが、ブレークポイントがうまく設定できないですね。 困りました。
|
これだとどうでしょうか!?
|
https://gist.github.com/hiroyuki-sato/21475340e8091f5b99e1 ブレークポイント設定できました。一歩前進です。 が libpoppler-glibの関数の情報が取得できていませんね。
さてどうしたものでしょう.. |
Popplerに-ggdb3を指定した手順を教えてもらえますか? |
./configureしたあと、 |
もうちょっと詳しく取得できました。 rubyがデバッグなしのものだったので、デバッグシンボルありのrubyでもう一度試しました。 |
b CairoOutputDev::setCairo |
これは、rg_renderでステップかけた方がいいでしょうか?
glib/poppler-page.cc static void
_poppler_page_render (PopplerPage *page,
cairo_t *cairo,
GBool printing,
PopplerPrintFlags print_flags)
{
CairoOutputDev *output_dev;
g_return_if_fail (POPPLER_IS_PAGE (page));
output_dev = page->document->output_dev;
output_dev->setCairo (cairo);
output_dev->setPrinting (printing); さらにrg_renderのところでも見てみましたが、ここでも分かりづらそうですね。 rbpoppler-page.c static VALUE
rg_render(VALUE self, VALUE ps_file_or_cairo)
{
if (RVAL2CBOOL(rb_obj_is_kind_of(ps_file_or_cairo, cPSFile))) {
return page_render_to_ps(self, ps_file_or_cairo);
} else {
return page_render(self, ps_file_or_cairo);
}
} |
おぉ! #79 (comment) に書いた通り、ステップ実行するのはPopplerやpoppler gemの中ではなく、cairoのなかです。なので、Popplerレベルでは |
こんな感じにしているのですが、 CAIRO_CREATEってメッセージが出てこないんですよね。やり方は間違えていないとは思うのですが、うーんというところで調べ中です。 |
out of memoryにステータスを変えているのは、下記のsetCairoですね。 glib/poppler-page.cc static void
_poppler_page_render (PopplerPage *page,
cairo_t *cairo,
GBool printing,
PopplerPrintFlags print_flags)
{
CairoOutputDev *output_dev;
g_return_if_fail (POPPLER_IS_PAGE (page));
output_dev = page->document->output_dev;
output_dev->setCairo (cairo);
output_dev->setPrinting (printing); こいつは、poppler_page_renderからのみ呼び出されているようなので poppler/ext/poppler/rbpoppler-page.c |
あ、失礼何が言いたいかというと、現在ブレークポイントをかけているのはスーテータスが変わってしまったところでかけています。 ステータスが変わる前はどこか?ということを調べるのにブレークポイントはどこに仕掛ければいいかな?と思っているところです。 |
OS XでPDFを表示すると落ちる。
詳細: https://gist.github.com/hiroyuki-sato/39aa614e6578709fa3a8
The text was updated successfully, but these errors were encountered: