programing tip

Leaks 계측기가 메모리 누수를 표시하지 않을 때 어떻게 메모리 누수를 디버깅합니까?

itbloger 2021. 1. 11. 07:43
반응형

Leaks 계측기가 메모리 누수를 표시하지 않을 때 어떻게 메모리 누수를 디버깅합니까?


메모리가 누출되는 Swift로 작성된 iOS 앱이 있습니다. 특정 상황에서 일부 객체는 릴리스되어야하지만 그렇지 않습니다. 다음 deinit과 같은 디버그 메시지 를 추가하여 문제에 대해 배웠습니다 .

deinit {
    println("DEINIT: KeysProvider released")
}

따라서 deinit 메시지는 객체를 해제해야하는 이벤트 후에 콘솔에 있어야합니다. 그러나 해제해야하는 일부 개체의 경우 메시지가 누락되었습니다. 그래도 Leaks Developer Tool은 누수를 표시하지 않습니다. 그러한 상황을 어떻게 해결합니까?


Xcode 8에서는 debugmemorygraphbutton디버그 도구 모음 (화면 하단에 표시)에서 "디버그 메모리 그래프"버튼을 클릭 할 수 있습니다 .

디버그 메모리 그래프

왼쪽 패널에서 할당이 취소되어야한다고 생각하는 개체를 식별하면 개체 그래프가 표시됩니다 (위의 기본 캔버스에 표시됨). 이는 해당 객체에 대해 강력한 참조가 설정된 위치를 빠르게 식별하는 데 매우 유용합니다. 여기에서 연구를 시작하여 이러한 강력한 참조가 해결되지 않은 이유를 진단 할 수 있습니다 (예 : 문제의 개체에 할당 해제되어야하는 다른 항목의 강력한 참조가있는 경우 해당 개체의 그래프도 볼 수 있습니다. 문제 (예 : 강력한 참조주기, 반복 타이머 등).

오른쪽 패널에 콜 트리가 표시됩니다. 구성표 설정에서 "malloc 스택"로깅 옵션을 설정하여이를 얻었습니다.

malloc 스택

어쨌든, 위의 첫 번째 화면 스냅 샷 오른쪽 패널의 스택 추적에 표시된 관련 메서드 호출 옆에있는 화살표를 클릭하면 해당 강력한 참조가 원래 설정된 위치를 볼 수 있습니다.

암호

위의 메모리 진단 기술 (및 그 이상)은 WWDC 2016 Visual Debugging with Xcode 후반부에 설명되어 있습니다.


전통적인 Instruments 기술 (특히 Xcode의 이전 버전을 사용하는 경우 특히 유용함)은 원래 답변에서 아래에 설명되어 있습니다.


"Record Reference Counts"기능과 함께 Instruments의 "Allocations"도구를 사용하는 것이 좋습니다.

레코드 참조 횟수

그런 다음 Instruments에서 앱을 실행 한 다음 누수중인 클래스를 검색하고 화살표를 클릭하여 드릴 인 할 수 있습니다.

여기에 이미지 설명 입력

You can then drill into the details and look at the stack trace using the "Extended Details" panel on the right:

확장 된 세부 사항

In that "Extended Details" panel, focus on your code in black rather than the system calls in gray. Anyway, from the "Extended Details" panel, you can then drill into your source code, right in Instruments::

당신의 코드

For more information and demonstrations in using Instruments to track down memory problems, please refer to:


Use instruments to check for leaks and memory loss due to retained but not leaked memory. The latter is unused memory that is still pointed to. Use Mark Generation (Heapshot) in the Allocations instrument on Instruments.

For HowTo use Heapshot to find memory creap, see: bbum blog

Basically the method is to run Instruments allocate tool, take a heapshot, run an iteration of your code and take another heapshot repeating 3 or 4 times. This will indicate memory that is allocated and not released during the iterations.

To figure out the results disclose to see the individual allocations.

If you need to see where retains, releases and autoreleases occur for an object use instruments:

Run in instruments, in Allocations set "Record reference counts" on (For Xcode 5 and lower you have to stop recording to set the option). Cause the app to run, stop recording, drill down and you will be able to see where all retains, releases and autoreleases occurred.

참조 URL : https://stackoverflow.com/questions/30992338/how-to-debug-memory-leaks-when-leaks-instrument-does-not-show-them

반응형