簡體   English   中英

從JVM崩潰日志中的堆棧跟蹤中獲取行號

[英]Getting line numbers from a stack trace in a JVM crash log

我正在嘗試使用libGDX修復某些代碼中的競態條件。 這種特殊的競爭條件會使JVM崩潰。

搜索JVM崩潰日志,發現以下幾行:

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 1128  com.badlogic.gdx.utils.BufferUtils.copyJni([FLjava/nio/Buffer;II)V (0 bytes) @ 0x0000000002d477b0 [0x0000000002d47740+0x70]
J 1365 C2 com.badlogic.gdx.graphics.g2d.SpriteBatch.flush()V (185 bytes) @ 0x0000000002e16ad4 [0x0000000002e16940+0x194]
J 1201 C1 com.badlogic.gdx.graphics.g2d.SpriteBatch.end()V (90 bytes) @ 0x0000000002d8f2d4 [0x0000000002d8f1c0+0x114]
J 1422 C1 com.me.mygame.screens.IslandScreen.render(F)V (848 bytes) @ 0x0000000002e40624 [0x0000000002e3a4e0+0x6144]
J 1539 C1 com.badlogic.gdx.Game.render()V (25 bytes) @ 0x0000000002e6c1dc [0x0000000002e6c000+0x1dc]
j  com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop()V+698
j  com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run()V+27
v  ~StubRoutines::call_stub

某一行涉及我自己的一些代碼:

J 1422 C1 com.me.mygame.screens.IslandScreen.render(F)V (848 bytes) @ 0x0000000002e40624 [0x0000000002e3a4e0+0x6144]

有什么辦法可以找到導致此問題的特定行是什么? 如果沒有,該怎么做才能調試此崩潰?

崩潰日志中的堆棧跟蹤可能包含解釋的和編譯的Java方法。

解釋的方法(用小j表示)還將包括字節碼索引(bci),例如

j com.me.mygame.screens.IslandScreen.render(F)V+727
                                                ^^^

在這里, render方法在位置727處執行字節碼。要將其與行號匹配,請使用Java反編譯器(如javap

javap -c -verbose -cp CLASSPATH com.me.mygame.screens.IslandScreen

查找將源代碼中的行映射到字節碼索引的LineNumberTable

  LineNumberTable:
    line 7: 0
    line 8: 11
    ...
    line 66: 707
    line 67: 719   <-- find the nearest bci
    line 68: 731

您需要bci最接近(但不超過)727的行號。在上面的示例中,它是67行。


或者,您可以請求JVM在崩潰前立即執行命令。 jstack將幫助生成包括行號在內的完整線程轉儲。

java -XX:OnError="jstack -F %p" ...

此處-F表示“強制”模式, %p自動替換為JVM進程ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM