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
'programing' 카테고리의 다른 글
Markdown/Textile을 HTML로 변환하는 자바스크립트(그리고 이상적으로 Markdown/Textile로 다시 변환) (0) | 2023.09.06 |
---|---|
XSD 파일을 XLS로 변환하는 방법 (0) | 2023.09.06 |
__inline_의 의미는 무엇입니까? (0) | 2023.09.06 |
비즈니스 계층에 EJB3 또는 Spring을 사용해야 합니까? (0) | 2023.09.06 |
MYSQL에서 문자열의 일부를 삭제하는 중 (0) | 2023.09.01 |