2013/08/01(木) [n年前の日記]
#1 [ruby] 例外をキャッチできず
RenderTarget に描画して画像保存をすると時々セグメントエラーが出る件。毎フレーム、RenderTarget を生成・使用・廃棄したらエラーが出なくなったので喜んだものの。何度か試してたらやっぱりエラーが発生して。
Ruby + DXRuby でセグメントエラー? Segmentation fault が発生した時は、begin 〜 rescue でキャッチできないのですな…。途中で強制終了してしまった。
こんな感じのメッセージが表示されて、止まってしまう。
上のリストを打っていて気になった点が。DXRuby に限らずだけど、Rubyのモジュール?の正確なバージョンを取得するのって、どうしたらいいんだろう…?
それはともかく。30FPSで全フレーム保存しようとしてるのだから、そりゃ落ちるだろ、と言われそうな気もする。でも、なんで落ちるのか、理由すら分からず。HDDへの書き込みが間に合わなくて落ちるとかそういうアレなんだろうか。
Ruby + DXRuby でセグメントエラー? Segmentation fault が発生した時は、begin 〜 rescue でキャッチできないのですな…。途中で強制終了してしまった。
こんな感じのメッセージが表示されて、止まってしまう。
c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/recseq.rb:384: [BUG] Segmentation fault
ruby 1.9.3p429 (2013-05-15) [i386-mingw32]
-- Control frame information -----------------------------------------------
c:0010 p:---- s:0061 b:0061 l:000060 d:000060 CFUNC :save
c:0009 p:0525 s:0056 b:0056 l:000055 d:000055 METHOD c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/recseq.rb:384
c:0008 p:0494 s:0041 b:0041 l:000040 d:000040 METHOD c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/recseq.rb:128
c:0007 p:2496 s:0032 b:0032 l:000020 d:000031 BLOCK main.rb:340
c:0006 p:---- s:0026 b:0026 l:000025 d:000025 FINISH
c:0005 p:---- s:0024 b:0024 l:000023 d:000023 CFUNC :loop
c:0004 p:0629 s:0021 b:0021 l:000020 d:000020 METHOD main.rb:99
c:0003 p:0549 s:0006 b:0006 l:00214c d:0005bc EVAL main.rb:362
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:00214c d:00214c TOP
-- Ruby level backtrace information ----------------------------------------
main.rb:362:in `<main>'
main.rb:99:in `main'
main.rb:99:in `loop'
main.rb:340:in `block in main'
c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/recseq.rb:128:in `update_and_draw'
c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/recseq.rb:384:in `export_mode'
c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/recseq.rb:384:in `save'
-- C level backtrace information -------------------------------------------
C:\Windows\SysWOW64\ntdll.dll(ZwWaitForSingleObject+0x15) [0x779bf8b1]
C:\Windows\syswow64\kernel32.dll(WaitForSingleObjectEx+0x43) [0x77201194]
C:\Windows\syswow64\kernel32.dll(WaitForSingleObject+0x12) [0x77201148]
C:\ruby193mingw\bin\msvcrt-ruby191.dll(rb_vm_bugreport+0xf9) [0x62e5bb59]
C:\ruby193mingw\bin\msvcrt-ruby191.dll(rb_name_err_mesg_new+0x17a) [0x62d3a856]
C:\ruby193mingw\bin\msvcrt-ruby191.dll(rb_bug+0x2f) [0x62d3b533]
C:\ruby193mingw\bin\msvcrt-ruby191.dll(rb_check_safe_str+0x194) [0x62dee790]
[0x004011e6]
[0x02fba0d2]
C:\Windows\SysWOW64\ntdll.dll(RtlKnownExceptionFilter+0xb7) [0x77a174df]
-- Other runtime information -----------------------------------------------
* Loaded script: main.rb
* Loaded features:
0 enumerator.so
1 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/enc/encdb.so
2 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/enc/shift_jis.so
3 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/enc/trans/transdb.so
4 C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/defaults.rb
5 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/rbconfig.rb
6 C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/deprecate.rb
7 C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/exceptions.rb
8 C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/defaults/operating_system.rb
9 C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
10 C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/rubygems.rb
11 C:/ruby193mingw/lib/ruby/site_ruby/1.9.1/i386-msvcrt/dxruby.so
12 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/win32ole.so
13 C:/ruby193mingw/lib/ruby/1.9.1/win32ole.rb
14 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/ayame.so
15 C:/ruby193mingw/lib/ruby/1.9.1/thread.rb
16 C:/ruby193mingw/lib/ruby/1.9.1/singleton.rb
17 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/msgwdw.rb
18 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/laps.rb
19 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/seq.rb
20 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/scroll.rb
21 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/anime.rb
22 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/exportexo.rb
23 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/select.rb
24 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/imagedata.rb
25 C:/ruby193mingw/lib/ruby/1.9.1/forwardable.rb
26 C:/ruby193mingw/lib/ruby/1.9.1/English.rb
27 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/date_core.so
28 C:/ruby193mingw/lib/ruby/1.9.1/date/format.rb
29 C:/ruby193mingw/lib/ruby/1.9.1/date.rb
30 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/stringio.so
31 C:/ruby193mingw/lib/ruby/1.9.1/csv.rb
32 C:/ruby193mingw/lib/ruby/1.9.1/prettyprint.rb
33 C:/ruby193mingw/lib/ruby/1.9.1/pp.rb
34 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/animekind.rb
35 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/config.rb
36 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/mnote.rb
37 C:/ruby193mingw/lib/ruby/1.9.1/benchmark.rb
38 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/bitmapfont.rb
39 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/keyboardimage.rb
40 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/keymapdisp.rb
41 c:/home/prg/NetBeansProjects/RubyAnimePvEasyMaker/lib/recseq.rb
42 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/enc/utf_16le.so
43 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/enc/trans/utf_16_32.so
44 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/enc/trans/japanese_sjis.so
45 C:/ruby193mingw/lib/ruby/1.9.1/i386-mingw32/enc/trans/single_byte.so
[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Compilation exited abnormally with code 3 at Thu Aug 01 17:18:27
一応、その384行前後もメモ。
@render.dispose unless @render.disposed?
@render = RenderTarget.new(@scrw, @scrh)
@anime.draw_rendertarget(@render)
if @frame > 0 then
begin
img = @render.toImage
img.save(fn, @outfmt) # ここが384行目。ここでエラーが出てる?
img.dispose unless img.disposed?
rescue
# 保存に失敗
@retry_count += 1
else
# 保存に成功
@retry_count = 0
end
@anime.update_pos if @retry_count <= 0 # 座標更新
end
@render.dispose unless @render.disposed?
環境は、
- Windows 7 x64
- ruby 1.9.3p429 (2013-05-15) [i386-mingw32]
- DXRuby 1.5 dev (2013/06/22頃にDLした版?)
上のリストを打っていて気になった点が。DXRuby に限らずだけど、Rubyのモジュール?の正確なバージョンを取得するのって、どうしたらいいんだろう…?
それはともかく。30FPSで全フレーム保存しようとしてるのだから、そりゃ落ちるだろ、と言われそうな気もする。でも、なんで落ちるのか、理由すら分からず。HDDへの書き込みが間に合わなくて落ちるとかそういうアレなんだろうか。
[ ツッコむ ]
以上、1 日分です。