2013-11-28 2 views
1

,이 같이 작동 재사용 LLDB 파이썬 스크립트를 작성하고 싶습니다 :이 같은객체의 주소가 주어지면 LLDB Python 스크립트에서 Obj-C 메소드를 호출하는 방법은 무엇입니까? 의사 코드에서

get_super_class(int address) { 
    return ((id)address).getSuperClass(); 
} 

를 호출 :

(lldb) get_super_class(0x123abc) 
UIViewController 

어떤 아이디어? 저는 파이썬 초보자입니다. 나는 내가 원하는 것에 가까이 다가 가려고하는 SBValue에 대한 문서에 뭔가가 있다고 생각 하겠지만, 만약 그렇다면 나는 그것을 보지 못한다.

답변

2

내 컴퓨터에서하지 않다가 (실제로 리노의 레스토랑에서 :) 그래서 다음 무엇을 주로 피상적이지만 올바른 방향을 가리켜 야합니다

싶은 것은 문자열로 표현을 구성입니다 . 당신은 foo는이

ID foo는 (아이디 인수) 할 수있는 일

문자열을 자신에게

"(ID) foo는 ((ID를 만들 같이 정의된다 foo는 (X)로 찾고 말) 0xaddr "

은 그럼 당신은 표현으로 그 평가하고 싶다.

내가 SBTarget 또는 SBFrame 중 하나는 당신이 당신의 충실하게 제작 된 문자열을 전달하는에 EvaluateExpression 방법 을 믿고, 가능하게 기억 동적 유형은 ObjC를 다루고 있고 대부분 해결되기를 원하기 때문입니다.

API가 반환하는 것은 또 다른 SBValue입니다. 값, 요약, 설명을 쿼리하거나 자식 값 등을 가져올 수 있습니다.

희망이 있습니다. 더 자세한 정보가 필요하면 언제든지 물어보십시오. 나는 기회가있을 때마다 격차를 메꿔 줄 것입니다!

+1

그게 다야! 내가 사용한 라인은 다음과 같다 :'debugger.GetSelectedTarget(). GetProcess(). GetSelectedThread(). GetFrameAtIndex (0) .EvaluateExpression ('((id) 0x8b464a0)') 어떤 주소를 전달했는지에 대한 유효한 SBValue 객체를 반환한다. in. – kubi

+1

참고 : 프레임 관련 정보가없는 표현식의 경우 프레임 관련 정보 대신 SBTarget :: EvaluateExpression()을 사용할 수 있습니다. 프레임의 컨텍스트에서 평가하는 것이 SBValue의 수명주기를 해당 스레드와 프레임에 고정시키는 것을 제외하고는 별 차이가 없습니다. –

1

나는 그것에 대해 SBValue을 사용하는 방법을 알고하지 않습니다,하지만 당신은 lldb으로 명령을 실행하고 출력의 캡처 SBCommandInterpreter를 사용할 수 있습니다

# First, get the command interpreter: 
ci = lldb.debugger.GetCommandInterpreter() 
# Then create an `SBCommandReturnObject` to capture the output 
output = lldb.SBCommandReturnObject() 
# run an lldb command to get the superclass 
ci.HandleCommand("po [" + address + " superclass]", output) 
# get the output and strip the trailing line break 
superclass = output.GetOutput().rstrip() 

가있을 수 있습니다 쉬운 방법 (하나의 희망) ,하지만 나는 아무것도 찾을 수 없었다.

+0

꽤 좋은 답변이지만, 내가 필요한 것은 아닙니다. 수퍼 클래스를 반환하는 예제는 단순화 된 것이기 때문에 LLDB 명령 줄을 호출하는 대신 실제 개체를 갖는 것을 선호합니다. 아마 당신의 답안 작업과 비슷한 것을 만들 수는 있지만, 결국은 마땅치 않습니다. – kubi