티스토리 뷰

아무런 상황에서나 원하는 인스턴스를 디버깅 하고 싶었다.

그치만 breakpoint가 걸린 시점에 원하는 인스턴스가 변수로 접근이 불가능한 시점이거나, View Hierarchy Debug 상태라 Variables View에 캡처된 변수가 없는 상태일 때는??

이럴때 내가 할 수 있었던 건

  • 싱글톤 같은 인스턴스를 po SomeClass.shared.someProperty
  • 현재 보이는 뷰의 description만 찍어보는 것,,
    이렇게 할 때 description 밖에 못 봤어서 아쉬웠다

아무튼 이렇게 밖에 못했기 때문에 원하는 인스턴스를 디버깅해보기 위해서는 변수로 접근할 수 있는 시점에 breakpoint를 찍고 들여다 봐야 했다.
이렇게,,

여태 이게 최선인줄 알았는데 그냥 나의 한계였다,,

오늘 이슈 처리하려고 우다다 디버깅 중이었는디

view description만 찍어봐도, memory graph에서 메모리에 있는 인스턴스만 봐도 object ID? 메모리 주소?들이 떡하니 있는데 왜 못할까? 싶어서 찾아봤닷

https://medium.com/mobile-app-development-publication/ios-advanced-debugging-using-po-8393bfefbeb
이 글을 보게됐고, 시도해봤다

오 된닷

엥 안된닷

엥 SceneDelegate는 왜 이렇게 해야될까...

뭔가,,, UILabel은 UILabel 인데 SceneDelegate는 사실은 _TtC4모듈이름13SceneDelegate(숫자는 고정 아닌듯?) 이런,, 거 같은데

UIViewController는 Quick Look을 하면 화면 preview가 보여져서 위의 SceneDelegate처럼 숨겨진 타입이름? 을 알아낼 수 없다..
아니 다른 방법이 더 있을 것 같은데;

--- 수정 ---

po ((id)ㅇㅇㅇ) 로 찍으면 일반 타입이 뜨는데,

p ((id)ㅇㅇㅇ) 로 찍으면 위에서 _TtC4모듈이름13SceneDelegate 처럼 찐? 타입 이름이 뜬다.

(얘네 타입 이름이 왜 이렇게 되는지는 나중에 알아봐야겠다.. 모듈화 할 때 두 가지 이상의 모듈에서 각각 A라는 모듈을 포함할 때 상위 모듈에서 누구의 A 모듈을 써야하니? 라며 오류 뜨는데 같이 연결지어 생각해봐야겠다!)

아무튼, 정리하자면
p ((id)ㅇㅇㅇ) 로 찐타입을 알아내고
p ((찐타입 *)ㅇㅇㅇ).프로퍼티 이런식으로 하면 lldb를 이용해서 variables view에 캡처되지 않은, 메모리에 살아있는 인스턴스를 좀 더 깊게 뜯어볼 수 있다.

 

--- 또 수정 ---

위 방법으로도 안될때가 있는데, 아래 방법으로 하면 됨..

https://stackoverflow.com/questions/29441418/lldb-swift-casting-raw-address-into-usable-type

(lldb) expr -l Swift -- import MyApp (클래스를 알고 있는 모듈 이름)

(lldb) expr -l Swift -- let $ec = unsafeBitCast(0x7ff73609c800, to: ExpandCell.self)

(lldb) expr -l Swift -- print($ec)

 

(lldb) expr -l Swift -- print($ec.data)