2017-06-27 2 views
0

J'essaie de corriger ce qui semble être une condition de concurrence dans un code en utilisant libGDX. Cette situation de concurrence particulière bloque la JVM lorsqu'elle se produit.Obtention de numéros de ligne à partir d'une trace de pile dans un journal de plantage JVM

Recherche dans le journal de plantage machine virtuelle Java, je trouve les lignes suivantes:

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 

Une ligne particulière implique une partie de mon propre code:

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

Est-il possible que je peux trouver ce que le ligne spécifique qui provoque c'est? Si non, que peut-on faire pour déboguer ce crash?

+0

Assurez-vous que vous n'instanciez, purgez ou ne purgez rien de la méthode de rendu. – Hllink

+0

Étant donné que cette méthode a la signature "void render (float)", recherchez cette méthode dans cette classe. Vous pouvez ensuite rechercher l'appel "void end()" pour trouver la ligne spécifique dans la méthode de rendu qui effectue l'appel. –

+0

Quelle est la complexité de votre méthode render()? Peut-être poster pourrait-il avoir de nouveaux yeux et peut-être signaler quelque chose que vous faites incorrectement? –

Répondre

1

Une trace de pile dans un journal de plantage peut contenir à la fois des méthodes Java interprétées et compilées.

Les méthodes interprétées (désignées par un petit j) comprendront également l'indice de bytecode (bci), par ex.

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

Voici la méthode render exécutait le bytecode à la position 727. Pour correspondre à un numéro de ligne utiliser Java Decompiler comme javap:

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

Rechercher des LineNumberTable qui associe des lignes dans le code source indices bytecode:

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

Vous avez besoin du numéro de la ligne avec le plus proche bci (mais ne dépassant pas) 727. ab Par exemple, il s'agit de la ligne 67.


Vous pouvez également demander à JVM d'exécuter une commande juste avant le blocage. jstack aidera à générer un vidage complet du fil, y compris les numéros de ligne.

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

Voici le mode -F moyen de forcé »et %p est automatiquement remplacé par ID de processus JVM.

+0

Merci, j'ai été en mesure d'obtenir une ligne numérotée pile trace avec jstack. – fridgefish