programing

Xcode/LLDB: 방금 발생한 예외에 대한 정보를 얻는 방법은 무엇입니까?

subpage 2023. 9. 6. 22:05
반응형

Xcode/LLDB: 방금 발생한 예외에 대한 정보를 얻는 방법은 무엇입니까?

좋아요, 그럼 상상해 보세요 제가 여기서objc_exception_throw방금 트리거를 했습니다.디버거 프롬프트에 앉아 있는데, 예외 개체에 대한 정보를 좀 더 얻고 싶습니다.어디에 있죠?

예외 개체는 다음의 첫 번째 인수로 전달됩니다.objc_exception_throw. LLDB 제공$arg1..$argn변수는 올바른 호출 규칙에서 인수를 참조하므로 예외 세부 정보를 쉽게 인쇄할 수 있습니다.

(lldb) po $arg1
(lldb) po [$arg1 name]
(lldb) po [$arg1 reason]

선택해야 합니다.objc_exception_throw이 명령을 실행하기 전에 콜 스택에서 프레임을 설정합니다.WWDC15 세션 비디오의 "Advanced Debugging and the Address Sanitizer"를 참조하여 스테이지에서 수행된 내용을 확인합니다.

시대에 뒤떨어진 정보

GDB를 사용하는 경우 첫 번째 인수를 참조하는 구문은 실행 중인 아키텍처의 호출 규칙에 따라 달라집니다.실제 iOS 기기에서 디버깅하는 경우 개체에 대한 포인터가 레지스터에 있습니다.r0. 문서를 인쇄하거나 문서로 메시지를 보내려면 다음과 같은 간단한 구문을 사용합니다.

(gdb) po $r0
(gdb) po [$r0 name]
(gdb) po [$r0 reason]

아이폰 시뮬레이터에서는 모든 함수 인수가 스택에 전달되므로 구문이 훨씬 더 끔찍합니다.내가 만들 수 있는 가장 짧은 표현은*(id *)($ebp + 8). 고통을 덜 느끼도록 하기 위해 편의 변수를 사용할 것을 제안합니다.

(gdb) set $exception = *(id *)($ebp + 8)
(gdb) po $exception
(gdb) po [$exception name]
(gdb) po [$exception reason]

설정할 수도 있습니다.$exception명령 목록을 에 추가하여 중단점이 트리거될 때마다 자동으로objc_exception_throw분기점

(테스트한 모든 경우에 예외 개체는 에도 있습니다.eax그리고.edx중단점이 적중한 시점에 등록합니다.하지만 항상 그럴지는 확신할 수 없습니다.

아래 의견에서 추가됨:

lldb에서 다음에 대한 스택 프레임을 선택합니다.objc_exception_throw다음 명령을 입력합니다.

(lldb) po *(id *)($esp + 4)

새로운 시뮬레이터(iOS 8, 64bit) xcode 6에서 예외 프레임에서 사용하고 있습니다.objc_exception_throw

po $rax

32비트 단위:

po $eax

락스란 무엇입니까?

Rax는 기존의 eax를 대체하는 64비트 레지스터입니다.

모든 레지스터를 찾는 방법은?

register read

출처 위키백과

이 글을 쓰는 시점에서, 이 게시물은 내 구글 최고의 히트작입니다: lldb 인쇄 예외.따라서, 저는 lldb와 x86_64에 대한 설명을 위해 이 답변을 추가합니다.

다음을 사용하여 예외를 찾으려는 시도po $eax실패한error: Couldn't materialize struct: Couldn't read eax (materialize). 이전 답변에서 연결된 문서에 설명된 다른 시도도 실패했습니다.

를 클릭해야 한다는 것이었습니다.objc_exception_throw나의 본실에 틀을 박아놓습니다.lldb는 해당 프레임에서 시작하지 않습니다.

제가 검색하고 따르는 모든 예에서, 이 블로그 항목은 저에게 효과적인 방법으로 설명한 첫 번째 항목이었습니다.그것은 2012년 8월에 게시된 것으로 더 현대적입니다.

캐치 문이 있는 경우 중단점을 입력하면 해당 지점에서 예외 개체를 검사할 수 있습니다.

캐치프레이즈가 없으면 계속 진행합니다.

단말기에 다음과 같은 메시지가 표시됩니다.

탐지되지 않은 예외 'NSIvalidArgument'로 인해 앱 종료예외', 이유: '* -[_NSplaceholderDictionary initWithObjects:forKeys:count:]: 개체[0]에서 nil개의 개체를 삽입하려고 시도합니다.'

하지만 응용 프로그램이 종료되면 좋은 스택 흔적이 없어지기 때문에 계속하지 않고 검사할 수 있는 방법을 찾고 있을 것입니다.

Fnord의 대답이 최선인 것 같지만 LLDB에서는 작동하지 않았습니다.

언급URL : https://stackoverflow.com/questions/3327828/xcode-lldb-how-to-get-information-about-an-exception-that-was-just-thrown

반응형