2024년 7월 11일 • ☕️ 2 min read
// 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())
}
앱을 실행하면 그 앱에 해당되는 메모리를 할당해주어야 하는데, 이 메모리의 정보를 알려주는 명령어는 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
메모리 주소는 16진수로 표현되기 때문에 0x
을 앞에 붙여서 읽어야 한다.
기본적으로 MacOS는 128비트로 메모리 주소는 16바이트로 표현되어야 하는데 사진 속에는 16자리가 아니다. 그 이유는 앞에 0이 생략되었기 때문이다. 만약 ab21f00 라면 앞에 9개의 0이 생략되서 표현된 것이다.
stack과 heap은 사진과 같이 범위로 표현이 되는데 xcode로 직접 메모리를 프린트하여 위 범위에 속하는 지 확인해볼 수 있다.