java - Solve random native crash on LibGDX game -
some of users of android game in i'm working experimenting critical crash hang mobiles. bug happens when game ends (when player die , outside viewport). pretty serious bug, refactored code , problem gone users, not all.
the report receive in google play similar this:
build fingerprint: 'google/hammerhead/hammerhead:4.4.2/kot49h/937116:user/release-keys' revision: '11' pid: 30442, tid: 30464, name: thread-458 >>> com.mygdxgame.android <<< signal 11 (sigsegv), code 1 (segv_maperr), fault addr 78c0b008 r0 78c0b008 r1 42bd8500 r2 00000188 r3 00000008 r4 753669c0 r5 42bd84f8 r6 b0800005 r7 78c0b008 r8 7547db10 r9 7537fd8c sl 75366a48 fp 7547db24 ip 00000000 sp 7547dae8 lr 75347c54 pc 4009e01a cpsr 60010030 d0 4458c000445b4000 d1 7e37e43c3c000000 d2 0000000000000000 d3 0000000000000000 d4 408b780000000000 d5 bf800000c0000000 d6 0000000000000000 d7 3f80000000000000 d8 408b180000000000 d9 408b1c0000000363 d10 0000000000000000 d11 3f80000000000000 d12 00000000000000ff d13 80000000bca3d70a d14 bf80000080000000 d15 0000000000000000 d16 409f255618c5b67c d17 414e508260000000 d18 3fe45f306dc9c883 d19 4337fffffffffff7 d20 bfdffffffd0c5e81 d21 3fa55553e1053a42 d22 3fefb9659d96e85e d23 3f33872815df26e1 d24 3ef99342e0ee5069 d25 3ed592dfbf0a142d d26 bfc0c4d52f39a3ad d27 bf62943a05b10df4 d28 3f33872815df26e1 d29 3ec6cd878c3b46a7 d30 bea6acf61c48ffe8 d31 c00921fb54442d18 scr 20000013 backtrace: #00 pc 0002201a /system/lib/libc.so (__memcpy_base+69) #01 pc 00037c50 /data/app-lib/com.mygdxgame.android-1/libgdx.so (java_com_badlogic_gdx_utils_bufferutils_copyjni___3fljava_nio_buffer_2ii+88) #02 pc 0001dbcc /system/lib/libdvm.so (dvmplatforminvoke+112) #03 pc 0004e123 /system/lib/libdvm.so (dvmcalljnimethod(unsigned int const*, jvalue*, method const*, thread*)+398) #04 pc 00026fe0 /system/lib/libdvm.so #05 pc 0002dfa0 /system/lib/libdvm.so (dvmmterpstd(thread*)+76) #06 pc 0002b638 /system/lib/libdvm.so (dvminterpret(thread*, method const*, jvalue*)+184) #07 pc 00060581 /system/lib/libdvm.so (dvmcallmethodv(thread*, method const*, object*, bool, jvalue*, std::__va_list)+336) #08 pc 000605a5 /system/lib/libdvm.so (dvmcallmethod(thread*, method const*, object*, jvalue*, ...)+20) #09 pc 0005528b /system/lib/libdvm.so #10 pc 0000d170 /system/lib/libc.so (__thread_entry+72) #11 pc 0000d308 /system/lib/libc.so (pthread_create+240) code around pc: 4009dff8 f811cb01 f800eb01 f800cb01 ea5feb01 <lines ommited> code around lr: 75347c34 e12fff3c e59d101c e59d2018 e1a02102 <lines ommited>
i don't info stack trace don't know how fix bug.
after reading post of people similar error (signal 11), i'm pretty sure error related box2d or batch use.
here part of code involved in bug.
gamescreen
public gamescreen(mygdxgame game) { super(game); worldnotifier = new worldnotifier(); worldcontroller = new worldcontroller(game, worldnotifier); worldinputprocessor = new worldinputprocessor(worldnotifier); worldnotifier.addlistener(worldcontroller); worldnotifier.addlistener(achievementsunlocker); } @override public void render(float delta) { if (!paused) { /* update game world */ worldcontroller.update(delta); } /* clear screen */ gdx.gl.glclearcolor(0, 0, 0, 1); gdx.gl.glclear(gl20.gl_color_buffer_bit); /* render game world */ worldrenderer.render(); } @override public void resize(int width, int height) { worldrenderer.resize(width, height); } @override public void show() { gamepreferences.getinstance().load(); worldrenderer = new worldrenderer(worldcontroller); /* initialize controller , renderer */ worldcontroller.init(); worldrenderer.init(); gdx.input.setcatchbackkey(true); gdx.input.setinputprocessor(new gesturedetector(worldinputprocessor)); } @override public void hide() { worldrenderer.dispose(); gdx.input.setcatchbackkey(false); }
worldcontroller
public worldcontroller(mygdxgame, worldnotifier worldnotifier) { this.game = game; this.worldnotifier = worldnotifier; rockspawner = new rockspawner(this); camerahelper = new camerahelper(); camerahelper.setaxislocked(false, true); } private void showscore() { game.scorescreen.setscore(withstoodtime); game.setscreen(game.scorescreen); } public void init() { if (world != null) { world.dispose(); } world = new world(new vector2(0, -9.81f), true); /* instantiate game objects */ <code omited> /* set controllers, listeners and... know, stuff needed */ buoyancycontroller = new buoyancycontroller(world, water.sensor); buoyancycontroller.lineardrag = constants.water_drag_force; world.setcontactlistener(new worldcontactprocessor(this, worldnotifier)); rockspawner.init(); camerahelper.settarget(pirate); starttime = timeutils.millis(); } public void update(float delta) { /* update withstood time */ withstoodtime = timeutils.millis() - starttime; /* update game objects */ <code omited> rockspawner.update(delta); buoyancycontroller.step(); world.step(1 / 60f, 6, 2); camerahelper.udpate(delta); } @override public void onplayerfalling() { player.die(); } @override public void onplayeroutsideviewport() { game.googleplayservicesresolver.submitscore((int) withstoodtime); showscore(); }
scorescreen
public scorescreen(mygdxgamegame) { super(game); font = new bitmapfont(); } @override public void render(float delta) { /* clear screen */ gdx.gl.glclearcolor(0, 0, 0, 1); gdx.gl.glclear(gl20.gl_color_buffer_bit); batch.begin(); string scoretext = "your score is: " + score; bitmapfont.textbounds textbounds = font.getbounds(scoretext); font.draw(batch, scoretext, (gdx.graphics.getwidth() - textbounds.width) / 2, gdx.graphics.getheight() - 20); batch.end(); if (gdx.input.istouched()) { game.setscreen(game.gamescreen); } } @override public void show() { batch = new spritebatch(); game.googleplayservicesresolver.showads(true); } @override public void hide() { batch.dispose(); game.googleplayservicesresolver.showads(false); } @override public void dispose() { font.dispose(); } public void setscore(long score) { this.score = score; }
so, error happens sometime between onplayeroutsideviewport call (this comes 1 or 2 seconds after onplayerfalling) , first render of scorescreen. callback (onplayeroutsideviewport ) called box2d contactlistener notify event using class, worldnotifier send notification worldlisteners.
i'm omitting lot of code add if need it. resolve annoying bug.
Comments
Post a Comment