Skip to content
isdnetworks
Go back

고쳤다고 했는데 확인을 안 했다

Android 앱이 간헐적으로 꺼진다는 얘기가 있었다. .cpp 를 보다가 의심스러운 데를 찾아 고쳤는데 며칠 뒤 같은 얘기가 또 나왔다.

Table of contents

Open Table of contents

고친 게 맞는지 몰랐다

문제는 고치기 전에 재현을 못 했다는 것이다. 재현을 못 했으니 원인을 확인 못 했고 원인을 모르니 고친 것이 맞는지도 모른다.

의심스러운 데를 고쳤다는 것은 아무것도 증명하지 않는다. 그 뒤로 증상이 안 나와도 고쳐진 것인지 우연인지 모른다.

재현부터 했다

문의 내용을 다시 읽고 공통점을 찾았다. 스테이지 중간에 꺼진다. 오래 하면 그렇다. 광고를 본 뒤인 것 같다. 셋이었다.

세 번째가 단서였다. 광고를 열 번 연속으로 열었다 닫아 보니 일곱 번째에 꺼졌다. 재현이 되니 그때부터 CCLOG 를 붙여 가며 좁힐 수 있었다.

절차를 글로 적어 두니 두 가지가 됐다. 고치기 전에 몇 번을 해도 같은 자리에서 나는지 볼 수 있다. 고친 뒤에도 같은 절차로 본다.

원인은 다른 데 있었다

로그를 붙여 보니 광고 Activity 가 닫힐 때였다. Cocos2dxActivity.onResume 쪽에서 replaceScene 을 부르고 있었다. CCDirector::resume() 만 부르면 될 자리다.

광고가 앞으로 오면 Cocos2dxGLSurfaceView 가 EGL 컨텍스트를 잃는다. 돌아올 때 VolatileTexture::reloadAllTextures() 가 전부 다시 올린다. 거기에 새 CCScene 까지 얹으니 옛 것과 새 것이 같이 남았다.

dumpCachedTextureInfo() 로 보니 광고를 닫을 때마다 텍스처가 늘고 있었다.

처음에 고쳤던 자리는 이것과 아무 관계가 없었다. 의심으로 고친 것이 맞을 확률이 낮다는 것을 그때 알았다.

고친 뒤 적어 둔 절차로 스무 번 돌렸고 안 났다. dumpCachedTextureInfo() 도 같이 봤는데 광고를 스무 번 봐도 안 늘었다. 증상이 안 나온다는 것만으로는 부족하다. 원인이라고 본 것이 실제로 없어졌는지를 봐야 한다.

재현이 안 될 때의 기록

전부 재현되는 것은 아니다. 특정 기기에서만 나거나 조건이 안 잡히는 것도 있다. 그때는 추측으로 고치더라도 그 사실을 적어 뒀다.

재현: 안 됨 (기기 A 에서만 보고됨)
추정: EGL 컨텍스트 복귀 시 텍스처 정리 누락
조치: onResume 의 replaceScene 을 CCDirector::resume 으로
확인: 재현 불가로 확인 못 함

이렇게 적으면 다음에 같은 증상이 나왔을 때 이어진다. 이미 고쳤다가 아니라 확인이 안 된 조치가 된다.

처음에 의심으로 고친 코드는 svn revert 로 되돌렸다. 이유 없는 변경이 남으면 다음 사람이 그것에 이유가 있다고 본다. 되돌리면서 그 부분이 정말 문제가 없는지는 한 번 더 봤고 문제가 있으면 별개 건으로 다뤘다.

정리


Share this post on:

Previous Post
이름 한 글자가 달라서 안 불렸다
Next Post
결제 영수증을 확인해야 했다