Development Tip

LLDB 디버거에서 메서드를 호출하거나 코드를 실행하는 방법은 무엇입니까?

yourdevel 2020. 12. 4. 20:59
반응형

LLDB 디버거에서 메서드를 호출하거나 코드를 실행하는 방법은 무엇입니까?


print someFloatVariable중단 점 또는을 설정할 때 입력 수 있다는 것을 알고 po [self someIvarHoldingAnObject]있지만 다음과 같은 유용한 작업을 수행 할 수 없습니다.

[self setAlpha:1];

그런 다음 뱉어냅니다.

오류 : '[self'는 유효한 명령이 아닙니다.

이상한 점은 제가 전화를 걸면 po [self someIvarHoldingAnObject]설명이 인쇄된다는 것입니다.

1 년 전에 누군가가 런타임에 콘솔을 통해 코드를 실행하는 방법을 시연 한 비디오를 본 적이 있다고 생각합니다. 내가 잘못하지 않으면이 사람도 인수를 제공하고 포인터에 개체를 할당했습니다. 그렇게하는 방법?


gdb v. lldb 명령에 대한 표준 참조는 http://lldb.llvm.org/lldb-gdb.html입니다.

표현식을 평가하는 expr 명령을 사용하려고합니다. 인수와 함께 "원시 입력"을받는 lldb 명령 중 하나이므로 인수 (expr)가 끝나고 명령이 시작되는 위치를 나타내는 "-"가 필요한 경우가 많습니다. 예 :

(lldb) expr -- [self setAlpha:1]

바로 가기 "p"가 있습니다.이 기능은-를 수행합니다 (하지만 인수를 허용하지 않음). 예 :

(lldb) p [self setAlpha:1]

호출하는 함수가 프로그램의 일부가 아닌 경우 반환 유형을 명시 적으로 선언해야 lldb가 호출 방법을 알 수 있습니다. 예 :

(lldb) p printf("hi\n")
error: 'printf' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) p (int)printf("hi\n")
(int) $0 = 3
hi
(lldb)

부동 소수점 인수 문제인 BTW를 해결할 수있는 깔끔한 방법이 있습니다. 클래스 메서드의 프로토 타입과 함께 lldb에 입력하는 모든 표현식에 추가되는 "표현식 접두사"파일을 만듭니다. 예를 들어, NSObject에서 상속 된 MyClass 클래스가 있습니다. 여기에는 "setArg :"및 "getArg"라는 두 가지 방법이 있습니다.이 메서드는 float ivar를 설정하고 가져옵니다. 이것은 어리석은 작은 예이지만 사용 방법을 보여줍니다. 다음은 lldb 용으로 작성한 접두사 파일입니다.

@interface NSObject
@end
@interface MyClass : NSObject
- init;
- setArg: (float)arg;
- (float) getArg;
@end

extern "C" {
  int strcmp (const char *, const char *);
  int printf(const char * __restrict, ...);
  void puts (const char *);
}

~/.lldbinit파일에 추가

settings set target.expr-prefix /Users/jason/lldb-prefix.h

이제 할 수 있습니다

(lldb)    p [var getArg]
(float) $0 = 0.5
(lldb)    p [var setArg:0.7]
(id) $1 = 0x0000000100104740
(lldb)    p [var getArg]
(float) $2 = 0.7

여기에도 몇 가지 표준 C 라이브러리 함수가 포함되어 있음을 알 수 있습니다. 이렇게 한 후에는 더 이상 이러한 반환 유형을 캐스팅 할 필요가 없습니다.

(lldb) p printf("HI\n")
<no result>
HI
(lldb) p strcmp ("HI", "THERE")
(int) $3 = -12

( "<결과 없음>"에 대한 수정이 이미 lldb TOT 소스에 커밋되었습니다.)


If you need multiline, use expression:

expression

do {
  try thing.save()
} catch {
  print(error)
}

// code will execute now

Blank line to finish and execute the code.

참고URL : https://stackoverflow.com/questions/12829665/how-to-call-methods-or-execute-code-in-lldb-debugger

반응형