Gemini 4로 PS Vita 게임의 PC 포트 메모리 누수 문제를 해결함
gemini 4 fixed a pc port of a ps vita game for me
핵심 요약
Gemini 4를 활용해 10년 넘게 방치된 게임의 메모리 누수 버그를 리버스 엔지니어링으로 해결한 사례입니다.
- 메모리 누수 해결 — 3D 렌더러의 COM 객체 해제 누락을 찾아내어 100% 안정성 확보함
- AI 리버스 엔지니어링 — SteamStub DRM을 우회하고 Nim 언어로 프록시 DLL을 제작함
- 기술적 성과 — 32비트 힙 파편화 문제를 해결하고 4K 환경에서도 안정적인 구동 구현함
- 향후 계획 — 다른 버그가 많은 게임 포트에도 동일한 AI 기반 수정 방식 적용 고려 중
이런 거 진짜 잘 안 하는데, AI 써서 게임 고질병 하나 고쳐보면 재밌겠다 싶어서 한번 해봤음.
2013년 일본 PS Vita 게임인 'Sorcery Saga'의 2018년 PC판 포팅 버전이 있는데, 포팅 업체인 'Ghostlight'가 똥을 싸놔서 메모리 누수 문제가 심각함. 이게 사람마다 다 나타나는 건지 확실하진 않은데, 지금 생각해보면 해상도 설정이랑 관련 있는 것 같음. 암튼 던전 들어가서 몇 층 올라가다 보면 던전 타일이 깜빡거리면서 사라지고, 주인공 이동 애니메이션도 아예 멈춰버림. 이 상태에서 다른 층으로 이동하거나 던전 밖으로 텔레포트하려고 하면 100% 확률로 "Malloc(8411929), Out of memory" 에러 뿜으면서 튕김.
구글 antigravity의 gemini 4한테 게임 디렉토리 던져주고 이거 고칠 수 있는지 확인해봤음. 결론부터 말하자면:
- gemini가 분석해보니 이 PC판은 2GB RAM 제한 걸린 32비트 PS Vita 포팅 버전이고, SteamStub DRM까지 씌워져 있었음. 즉, .exe 파일 1바이트라도 건드리면 무결성 검사 걸려서 게임 자체가 아예 안 켜짐.
- 그래서 gemini가 내가 평소에 쓰는 언어인 nim이랑 다른 프로젝트 때 만들어둔 커스텀 라이브러리 조합해서 32비트 XINPUT1_3.dll 프록시를 짰음. SteamStub가 RAM에서 .exe 복호화할 때까지 기다렸다가 게임의 Vita-to-DirectX11 렌더러를 디스어셈블한 거지.
알고 보니 32비트 힙을 8.4MB .CL3/16MB .tid 로드하면서 조각내는 건 둘째치고, 게임 3D 드로우 루프에서 CreateDepthStencilState랑 CreateRasterizerState를 초당 3800번씩 호출하는데 ->Release()를 단 한 번도 안 함. 게다가 CreateSamplerState 래퍼에서는 개발자가 isDirty = 0 초기화하는 걸 까먹었더라. d3d11.dll / nvwgf2um.dll 내부에서 초당 7000개씩, 몇 분만 지나도 수백만 개의 DirectX 11 COM 객체가 줄줄 새고 있었던 거임.
게임 돌리면서 텔레메트리 수집하고 로그 까보는 과정을 몇 번 반복하니까, gemini가 193KB짜리 드롭인 XINPUT1_3.dll을 뽑아줬음. 이게 임시 에셋용으로 64 MiB 가상 아레나를 할당하고, 64개 항목짜리 디스크립터 캐시로 D3D11 상태 래퍼 4개를 후킹함(적중률 99.9995%, 수백만 번의 호출을 캐시 객체 10개로 압축). 가상 메모리 소모량이 초당 4.04 MB에서 0 MB로 줄어들면서, 4K 해상도에서 몇 층을 내려가든 게임이 100% 안정적으로 돌아감. 예전엔 몇 층만 가도 튕기던 게 지금은 두 시간째 아무 문제 없이 잘 돌아가는 중.
포팅 업체가 진작 고쳤어야 할 걸 안 고친 게 좀 어이없긴 한데, AI 써서 이런 문제까지 직접 고칠 수 있다는 게 진짜 신기하더라.
다른 최신 AI들도 다 할 수 있었을 것 같긴 한데, 내가 평소에 AI를 꾸준히 쓰는 편이 아니라서 ChatGPT나 Claude 같은 건 써본 적이 없음. 그냥 AI 필요할 때마다 우연히 Gemini를 썼던 거임. 어차피 이 짓 안 하면 게임은 절대 안 고쳐질 거고 아예 못 하는 상태였으니까. 암튼 그냥 공유하고 싶었던 재밌는 경험담임. 몇 시간 걸리긴 했는데 gemini 4가 일 잘하네!


