2014-01-05 35 views
3

當我的jruby程序意外提高並給我一個堆棧跟蹤時,它幾乎是無法理解的。它顯然來自內部解釋器的東西,使我很難找出真正的實際程序的實際調用堆棧是什麼。有沒有辦法在jruby中獲得合理的堆棧跟蹤?

之類的東西(只是一個節選):

from CachingCallSite.java:326:in `cacheAndCall' 
    from CachingCallSite.java:170:in `call' 
    from CallOneArgNode.java:57:in `interpret' 
    from LocalAsgnNode.java:123:in `interpret' 
    from NewlineNode.java:105:in `interpret' 
    from BlockNode.java:71:in `interpret' 
    from RescueNode.java:222:in `executeBody' 
    from RescueNode.java:117:in `interpret' 
    from EnsureNode.java:96:in `interpret' 
    from ASTInterpreter.java:74:in `INTERPRET_METHOD' 
    from InterpretedMethod.java:161:in `call' 
    from DefaultMethod.java:178:in `call' 
    from CachingCallSite.java:316:in `cacheAndCall' 

而且它不只是像這些都是從我的實際程序穿插調用棧線 - 我的實際程序調用堆棧似乎並沒有出現在棧跟蹤。使它不那麼有用,因爲它的目的是幫助我找出實際提出異常的原因。

我想我記得在過去的某個時間點,給出一些命令行參數來給出與調試或JIT有關的jruby,這會導致一個合理的堆棧跟蹤(可能以JIT性能爲代價或者其他的東西?)。

但試圖再次找到這個,我沒有運氣,花了相當多的時間試圖找到jruby文檔,谷歌搜索等,沒有找到任何命令行參數導致合理的堆棧跟蹤運氣。

有人知道嗎?

回答

2

我會經常force compilation代碼與jruby.compile.mode=FORCE,因爲編譯的代碼將在堆棧跟蹤中的Ruby名稱和行號。這會讓事情總體變慢,所以我不會一直放棄它。

As of JRuby 1.7.10,嘗試將jruby.rewrite.java.trace設置爲true。

編輯

從同Twitter的討論中,另一種想法是使用

rescue NativeException 
    raise 
end 

其中也可能有幫助。當然,你必須知道發生異常的位置,但它應該有助於掐。

+1

我只是想發佈'rescue NativeException;提高; 「解決方案」,但它似乎從我的鳴叫已經得到它自己的翅膀... – Theo

+0

如何執行jruby應用程序時設置這些類型的java屬性?謝謝! – jrochkind

+0

@jrochkind https://github.com/jruby/jruby/wiki/ConfiguringJRuby有一個很好的概述(看大代碼部分的頂部) – Shepmaster