Xcode에서 LLDB로 디버깅하는 동안 변수 값을 변경하는 방법은 무엇입니까?


173

Xcode에서 GDB를 사용하면 디버깅하는 동안 로컬 변수를 변경할 수 있습니다 ( XCode에서 디버깅하는 동안 NSString 값을 변경하는 방법 참조 ). LLDB는 비슷한 기능을 제공합니까? 그렇다면 어떻게 사용할 수 있습니까?


iOS의 고급 디버깅 을 참조하십시오 . 그것은 끝내

문자열 길이가 0-15 자 사이 인 경우 작동하는 객체 속성을 설정하려고합니다. 16 자 이상의 문자열을 설정하는 것은 허용되지만 다시 인쇄하면 의미없는 문자열이 표시됩니다. po myObj.someString = "1234567890123456", 작동하지만 인쇄 할 때 (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

답변:


267
expr myString = @"Foo"

(lldb) help expr
현재 범위 내에있는 변수를 사용하여 현재 프로그램 컨텍스트에서 C / ObjC / C ++ 표현식을 평가합니다. 이 명령은 '원시'입력을받습니다 (물건을 인용 할 필요 없음).

구문 : expression-

명령 옵션 사용법 : expression [-f] [-G] [-d] [-u]-expression [-o] [-d] [-u]-expression

   -G <gdb-format>  ( --gdb-format <gdb-format> )
        Specify a format using a GDB format specifier string.

   -d <boolean>  ( --dynamic-value <boolean> )
        Upcast the value resulting from the expression to its dynamic type
        if available.

   -f <format>  ( --format <format> )
        Specify a format to be used for display.

   -o  ( --object-description )
        Print the object description of the value resulting from the
        expression.

   -u <boolean>  ( --unwind-on-error <boolean> )
        Clean up program state if the expression causes a crash, breakpoint
        hit or signal.

예 :

expr my_struct-> a = my_array [3]
expr -f bin- (인덱스 * 8) + 5
expr char c [] = "foo"; c [0]

중요 참고 :이 명령은 '원시'입력을 사용하므로 명령 옵션을 사용하는 경우 명령 옵션의 끝과 원시 입력의 시작 사이에 '-'를 사용해야합니다.

'expr'은 'expression'의 약어입니다.


1
정말로 감사합니다! 하나 더 작은 질문 : UILabel의 텍스트를 변경 하려고이 작업을 수행하고 있습니다. 'expr myLabel.text = @"hello!"그러나 error: property 'text' not found on object of type 'UILabel *'... 어떤 생각이 있습니까?
Eric

10
expr (void)[label setText:@"Foo"]해야합니다. 도트 구문은 일반적으로 디버거에서 작동하지 않습니다. lldb는 아마도 당신이 c-struct의 멤버에 액세스하기를 원할 때 그것을 해석하지만 이것이 이것이 작동하지 않는 이유인지 확실하지 않습니다. Dot-Syntax도 작동하지 않습니다 po. 대신 po label.text당신이 사용해야합니다po [label text]
마티아스 Bauch

4
실제로 lldb는 gdb보다 점 구문을 훨씬 잘 처리합니다. gdb는 C-struct처럼 처리한다고 가정하고 실패합니다. lldb는 속성에 실제로 액세스하지만 실제로 속성이로 선언 된 경우에만 해당됩니다 @property.
BJ 호머

28
p바로 가기로 사용할 수도 있습니다 expr. 예 :(lldb) p url = @"http://google.com"
funroll

11
e바로 가기로 사용할 수도 있습니다 expr. BTW p는 인쇄의 별명으로 expr --(evalue raw input, 플래그 없음) 의 별명 expr -o -- [object]이거나 po일반적으로 객체에 대해 더 유용한 출력을 제공합니다.
Jason Newell

21

다음은 나를 위해 작동합니다. Xcode 8을 사용하고 있습니다.

변수 (예 : "dict")를 nil로 설정 한 다음 코드 흐름을 테스트하려면 다음을 시도해보십시오.

  1. 원하는 값으로 초기화 한 후 중단 점을 올바르게 설정하십시오.
  2. 그런 다음 lldb 명령 행에서 "expression dict = nil"을 실행하여 변경하십시오. (예 : "nil")
  3. 중단 점을 넘어서십시오.
  4. 다음 줄에서 변수 "dict"를 확인하십시오. 그것은 없을 것입니다.

콘솔과 비슷한 모양입니다.

(lldb) expression dict = nil
(NSDictionary *) $5 = nil

3

Xcode 10 또는 11을 사용하는 경우 필요한 변수로 초기화 한 후 중단 점을 올바르게 설정하면 po myString = "Hello World"쉽게 사용하여 변수를 변경할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.