이재용의 iOS

Swift Memory 주소 확인 방법

2024년 7월 11일 • ☕️ 2 min read

    Swfit 메모리 주소 확인 방법

    // value-type
    @inlinable func printMemoryAddress<T>(_ o: inout T) { 
    	withUnsafePointer(to: &o) { 
    		print($0) 
    	}
    }
    func address(_ o: UnsafeRawPointer) -> String {
    	let bit = Int(bitPattern: o)
        return String(format: "%p", bit)
    }
    
    // ref-type 
    @inlinable func dump(object: AnyObject) {
        print(Unmanaged.passUnretained(object).toOpaque())
    }

    struct, heap 주소 범위 확인하기

    앱을 실행하면 그 앱에 해당되는 메모리를 할당해주어야 하는데, 이 메모리의 정보를 알려주는 명령어는 vmmap(virtual memory map)이다.

    우선 앱의 PID(Process ID)를 먼저 확인한다. 앱의 PID를 확인할 수 있는 방법은 여러 방법이 있지만 가장 간단한 방법은 xcode에서 breakpoint를 찍고 확인하는 방법이다.

    PID를 확인했다면 terminal에서 vmmap {PID} | grep stack 또는 vmmap {PID} | grep MALLOC을 입력한다.

    MALLOC은 heap 영역 관련 메모리로 아래와 같이 종류가 다양하며 각각 쓰임이 다르다.

    • MALLOC guard page
    • MALLOC Metadata
    • MALLOC_LARGE
    • MALLOC_SMALL
    • MALLOC_TINY
    • 등등..

    vmmap

    vmmap

    메모리 주소는 16진수로 표현되기 때문에 0x을 앞에 붙여서 읽어야 한다.

    기본적으로 MacOS는 128비트로 메모리 주소는 16바이트로 표현되어야 하는데 사진 속에는 16자리가 아니다. 그 이유는 앞에 0이 생략되었기 때문이다. 만약 ab21f00 라면 앞에 9개의 0이 생략되서 표현된 것이다.

    stack과 heap은 사진과 같이 범위로 표현이 되는데 xcode로 직접 메모리를 프린트하여 위 범위에 속하는 지 확인해볼 수 있다.