2016-06-06 2 views
0

심볼릭 브레이크 포인트를 사용하여 - [UIView (Geometry) setFrame :] 및 심볼릭 브레이크 포인트에서 lldb를 중지하면 프레임 변수 명령을 입력하여 아무 것도 얻지 못했습니다 ... 정말로 아무것도.x86_64에서 UIView (Geometry) setFrame을 내 보냅니다.

내가 시도한 것들. 최적화 켜기 및 끄기. 다른 아치 64, 32 enter image description here

이 코드는 바로

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

+1

그래서이 질문이있는 WWDC에 갔고 x86_64에서 모든 것이 다르다는 것은 어떤 유형이 전달되며 호출 규칙에 대한 문서를 참조해야하는지에 달려 있다고합니다. 그러나이 경우 여기에서 값은 다른 블로그에서 지적 된 것처럼 xmm0,1,2,3 부동 소수점 레지스터에 고정됩니다. 하지만 내가 Apple 엔지니어로부터 얻은 요지는 프로토 타입 함수를 생성하고 해체 한 다음 어떤 레지스터가 들어갔다는 것을 알아낼 수 있는지 알고 싶다면 –

+0

안녕하세요 @DavidYangLiu, nice를 주셔서 감사합니다. 논평. 당신은 실제로 그것에 대한 답을 낼 수 있습니다. '[UIView setFrame :]도 디버깅 중입니다. 프레임을 유지하는 $ arg6을 찾았습니다. –

답변

0

rdi에게 전달된다 x86_64의 기능에 대한 첫 번째 인수 ($arg1)를 던진다. x86_64 ($arg2)의 함수에 대한 두 번째 인수는 rsi으로 전달됩니다. 세 번째 인수는 rdx입니다. 나는 그 값을 p으로 전달할 때보고있는 문제의 근원이라고 생각합니다.

(짧은 설명 : fr v)는 디버그 정보가있는 변수 만 표시합니다. 디버그 정보가없는 일반 어셈블리 함수로 중지되었습니다. 첫 번째 pc 값에서 첫 번째 인수는 rdi이고`rsi 등 '의 두 번째 인수는 lldb COULD이고 변수를 "변수"라고 표시하지만 함수를 단계별 실행하면 다른 레지스터에 다시 사용할 수 있습니다 값 (예 : 다른 함수가 호출 된 경우)이 더 이상 해당 레지스터에 무엇이 있는지 말하는 것이 안전하지 않습니다.