2013-01-09 3 views
5

방금 ​​this LLDB의 편리한 기능을 통해 LLDB의 중단 점에있을 때 프레임의 변수에 액세스 할 수있는 Python 스크립트를 작성할 수있었습니다. 그러나 Xcode (v4.5.2)에서 사용할 때 몇 가지 문제가 있습니다. 첫째로, 어디에서이 Python 스크립트를 유지해야 하는지를 알 수는 없으므로 LLDB의 명령 줄에서 가져올 수 있습니다. 둘째로, script을 LLDB에 입력하면 키보드 입력이 약간 잘못됩니다. 백 스페이스는 화면의 문자를 삭제하지 않지만 효과적으로 명령에서 삭제합니다. 따라서 primt<bsp><bsp><bsp>int을 입력하면 print을 의미하지만, 여전히 단말에서는 primtint으로 표시됩니다. 이건 그냥 미학적이지만 꽤 짜증나!LLDB Xcode의 Python 스크립팅

누군가가 LLDB에서 파이썬을 사용하기위한 특정 Xcode 관련 리소스를 가르쳐 줄 수 있습니까?

EDIT : Here은 Python을 사용하여 변수에 대한 사용자 지정 요약을 만드는 데 사용할 수있는 또 다른 흥미로운 링크이지만 그와 관련된 내용을 찾을 수는 없습니다.

답변

13

Xcode, lldb 및 Python 인터프리터 사이에는 불행히도 대화 형 콘솔에 몇 가지 문제가 있습니다. http://bugreport.apple.com/에 버그 보고서를 보내주십시오.이 문제점에 대한 버그 보고서가 이미 있는지는 잘 모르겠지만 여기에 일반적으로 알려진 문제점은 있습니다. 대화 형 Python 스크립팅 인터페이스를 탐색하는 경우 명령 줄 lldb 도구를 사용할 수 있습니다. 그게 더 잘 작동합니다.

저는 모든 파이썬 스크립트를 lldb 용으로 ~/lldb에 넣었습니다. 내 ~/.lldbinit 파일에서 나는 그들을 소스. 그게 내가 원하는 거라면 내가 자동으로로드 내 ~/.lldbinit 파일에 command script import을 둘 것입니다

import lldb 

# Use this like 
# (lldb) command script import ~/lldb/stopifcaller.py 
# (lldb) br s -n bar 
# (lldb) br comm add --script-type python -o "stopifcaller.stop_if_caller(frame, 'foo')" 1 

def stop_if_caller(current_frame, function_of_interest): 
    thread = current_frame.GetThread() 
    if thread.GetNumFrames() > 1: 
    if thread.GetFrameAtIndex(1).GetFunctionName() != function_of_interest: 
     thread.GetProcess().Continue() 

인 예를 들어, 내가 ~/lldb/stopifcaller.py 있습니다. 이 특별한 예제는 중단 점 # 1에 파이썬 명령을 추가합니다. lldb가 중단 점에서 멈 추면 호출 함수를 볼 것입니다. 호출 기능이 foo이 아니면 자동으로 실행이 재개됩니다. 본질적으로 중단 점 1은 foo()가 bar()를 호출하는 경우에만 중지됩니다. command script import ~/...에서 Xcode 4.5 lldb에 문제가있을 수 있습니다. 홈 디렉토리 (/Users/benwad/ 또는 무엇이든)의 전체 경로를 입력해야 할 수도 있습니다. 나는 확실히 기억할 수 없다 - 잠시 동안 수정 된 Xcode 4.5의 물결 확장 문제가 있었다.

간단한 유형 요약을 ~/.lldbinit에 직접 추가 할 수 있습니다. 예를 들어, lldb 자체를 디버깅 할 경우 ConstString 객체는 나에게 관심있는 필드가 하나뿐입니다. m_string ivar.그래서

type summary add -w lldb lldb_private::ConstString -s "${var.m_string}" 

이 아니면이 유형 addr_t 있다면, 난 항상 당신이 lldb에 새 명령을 추가하려면 포맷 진수로 내가

type format add -f x lldb::addr_t 

을 가지고 싶어, 당신은 파이썬있을 것입니다

import lldb 

def say_hello(debugger, command, result, dict): 
    print 'hello' 

def __lldb_init_module (debugger, dict): 
    debugger.HandleCommand('command script add -f sayhello.say_hello hello') 

, ~/lldb/sayhello.py 같은 파일 당신은

처럼 lldb하는 데에로드합니다

당신은 파이썬으로 작성된 명령을 명령 옵션 구문 분석을 수행 할 수 있도록 당신이 shlexoptparse 라이브러리를 사용합니다, 그리고 당신은 __doc__ 문자열을 추가 할 것입니다을 추가하는 대부분의 시간 - 나는 계속 그 일을 생략 간단한 예.

+0

감사합니다. 나를 시작하게 해주는 매우 유용한 정보. – benwad

+0

'lldb''python' 스 니펫으로 github repo를 가지지 않으십니까? (나는 보았고, 사람을 보지 않았다. .. 시작하는 것은 공상한다?) 나는 그것이 매우 흥미있는 것이라고 생각한다. – trojanfoe

+5

우리는 요리 책 스타일의 문서를 lldb 웹 사이트에 간단한 문제 모음과 해결책을 추가해야 할 필요가 있다고 생각합니다. 아마도 이런 종류의 일에 가장 적합한 장소 일 것입니다. 시간 부족. : ( –