본 포스팅은 ヒープダンプから、その瞬間の各オブジェクトの持っている状態を調べよう 을 기본으로 번역하여 작성했습니다
제 일본어 실력으로 인하여 오역이나 오타가 발생할 수 있습니다.
디버그 중, 무언가 좋지 않은 행동을 발견 시에 수상한 객체가 가진 상태가 어떤지를 찾을 경우에 있어, Debugger를 붙여 조사하는 것이 곤란할 때가 있습니다. 예를 들면, 수상한 행동이 재현되지 않는 경우를 생각해보면 또다시 같은 행동이 일어날 때까지 상당한 시간이 필요하게 될지도 모릅니다. 원래 어디가 문제인지 모르는데 무의미하게 Debugger를 연결하는 것은, 검증에 걸리는 시간이 쓸데없이 길어질 가능성도 있습니다.
이 기사는 수상한 행동을 발견한 순간에, Debugger에 의지하지 않고도 객체가 가지고 있는 상태가 어떤지를 알고 싶은 사람을 위한 순서를 정리했습니다.
AndroidStuido에는, 각각의 프로세스가 얼마나 메모리나 CPU, GPU의 자원을 소비하고 있는지를 시각화해주는 도구를 포함하고 있습니다. 평소에는 Logcat를 사용하는 일이 많지만, 화면 아래의 Android Monitor라는 메뉴 중에 Logcat이외에 「Memory」「CPU」「GPU」「Network」Tab이 있어 각각 보고 싶은 프로세스마다 Graph가 표시되게 되어있습니다.
가로축은 시간이므로, 그냥 두면 Graph가 흘러갑니다.
이 Graph는 사실은 단순히 Memory 사용량 상태를 시각화해주는 것만은 아닙니다. 이 Graph의 좌측을 보면, 몇 가지 버튼이 있는 것을 알 수 있습니다.
이 중에, 아래쪽 화살표를 가지는 위에서 3번째 버튼이 HeapDump를 받기 위한 버튼입니다.
HeapDump를 받아보면, Button 아이콘이 Graph 위에 나타납니다
이 아이콘이 표시된 타이밍의 HeapDump가 취득된 것을 알 수 있습니다.
HeapDump가 끝나면 hprof 파일이 자동으로 열립니다.
기본적으로 애플리케이션의 힙에 있는 각 클래스의 목록이 표시될 것 입니다.
여기서 어떤 클래스 이름을 클릭해보면, 힙에 올려져 있는 Instance 리스트가 우측에 표시됩니다.
Instance 리스트 중 하나를 클릭하면, 상세 리스트가 확장되고 그 Instance의 내부 상태가 표시됩니다.
이걸로 Instance의 상태가 어떻게 되어있는지 훔쳐 볼 수 있습니다. 그리고 어느 Property가 틀린 값으로 되어있는지를 조사하는 것으로 수상한 행동을 찾아갈 수 있습니다.
몇 가지 방법이 있습니다.
HeapDump이라면 아무래도 Memory Leak 조사에 주안점을 두는 경향이 되지만, AndroidStuido을 사용하면 Memory에 올려있는 객체의 상태도 볼 수 있습니다. 물론, 왜 그런 상태가 된 것인지를 확인하기 위해서는, Debugger를 연결해서 상태 변화하는 곳에 Breakpoint를 걸고 변화 시의 Stacktrace을 보는 등의 방법도 중요하지만, 원래 무엇이 어떻게 잘못되어있는가를 확인하려면 HeapDump를 활용하는 편이 다소 쉽게 할 수 있습니다.
comments powered by Disqus
Subscribe to this blog via RSS.
LazyColumn/Row에서 동일한 Key를 사용하면 크래시가 발생하는 이유
Posted on 30 Nov 2024