Java 从JVM崩溃日志中的堆栈跟踪获取行号

Java 从JVM崩溃日志中的堆栈跟踪获取行号,java,libgdx,crash,jvm,stack-trace,Java,Libgdx,Crash,Jvm,Stack Trace,我正在尝试使用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 [0x0000000

我正在尝试使用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),例如

这里的方法
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

这里
-F
表示“强制”模式,
%p
被JVM进程ID自动替换。

崩溃日志中的堆栈跟踪可能包含解释和编译的Java方法

解释方法(用小的
j
表示)也将包括字节码索引(bci),例如

这里的方法
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

这里
-F
表示“强制”模式,
%p
自动被JVM进程ID替换。

确保没有实例化、清除或刷新渲染方法上的任何内容。由于该方法具有签名“void render(float)”,因此请在该类中查找该方法。然后,您可以查找“void end()”调用,以查找导致调用的render方法中的特定行render()方法有多复杂?也许这篇文章会让人耳目一新,也许会指出你做得不正确?请确保你没有在render方法上实例化、清除或刷新任何内容。因为该方法具有签名“void render(float)”,所以请在该类中查找该方法。然后,您可以查找“void end()”调用,以查找导致调用的render方法中的特定行render()方法有多复杂?也许这篇文章会让你有新的眼光,也许会指出你做得不对?谢谢,我能用jstack获得行号堆栈跟踪。谢谢,我能用jstack获得行号堆栈跟踪。