심볼릭 브레이크 포인트를 사용하여 - [UIView (Geometry) setFrame :] 및 심볼릭 브레이크 포인트에서 lldb를 중지하면 프레임 변수 명령을 입력하여 아무 것도 얻지 못했습니다 ... 정말로 아무것도.x86_64에서 UIView (Geometry) setFrame을 내 보냅니다.
내가 시도한 것들. 최적화 켜기 및 끄기. 다른 아치 64, 32
이 코드는 바로
let rect = CGRect(x: 0, y: 0, width: 320, height: 1230)
view.frame = rect
무엇 난 정말 후 오전하면 CGRect 매개 변수에서 디버깅 할 수있는 브레이크 포인트 전에 실행되는 64 비트에있는 동안 32 비트 *(CGRect *)($esp + 12)
동안 64에서 잘 작동하지만 *(CGRect *)$rdx/rcx
오류 : 표현식을 적용 할 수 없음 부작용 : 결과 변수를 비 물질화 할 수 없습니다. 메모리를 읽을 수 없습니다.
그래서 벽을 치면 프레임 변수를 볼 수 있다고 생각했습니다. 이 사실을 알게되었습니다. 하나는 값 또한
가 같은 결과를 산출한다 ARG2 ➡ $의 RDX 이후 기호 인 가치를 디버깅하는 방법을 알고 있지만, 그들은
ARG2 인쇄 밖으로 CGRect는하지 않지만 경우는 잘못된 값을 가지고
하지만 $ RDX의 오류
(lldb) po *(CGRect*)$arg2 (origin = (x = 3.8098582624090393E+180, y = 3.6806986858704324E+180), size = (width = 4.9279512391228864E+180, height = 1.469851705066036E-307)) (origin = (x = 3.8098582624090393E+180, y = 3.6806986858704324E+180), size = (width = 4.9279512391228864E+180, height = 1.469851705066036E-307)) (lldb) p *(CGRect*)$rdx error: Couldn't apply expression side effects : Couldn't dematerialize a result variable: couldn't read its memory
그래서이 질문이있는 WWDC에 갔고 x86_64에서 모든 것이 다르다는 것은 어떤 유형이 전달되며 호출 규칙에 대한 문서를 참조해야하는지에 달려 있다고합니다. 그러나이 경우 여기에서 값은 다른 블로그에서 지적 된 것처럼 xmm0,1,2,3 부동 소수점 레지스터에 고정됩니다. 하지만 내가 Apple 엔지니어로부터 얻은 요지는 프로토 타입 함수를 생성하고 해체 한 다음 어떤 레지스터가 들어갔다는 것을 알아낼 수 있는지 알고 싶다면 –
안녕하세요 @DavidYangLiu, nice를 주셔서 감사합니다. 논평. 당신은 실제로 그것에 대한 답을 낼 수 있습니다. '[UIView setFrame :]도 디버깅 중입니다. 프레임을 유지하는 $ arg6을 찾았습니다. –