2012-03-27 2 views
4

여기에 약간의 노력을하고 있습니다. 그러나 가능한 것이 좋습니다. 어쩌면 LLDB는 여전히 너무 새롭지 만, 디버거 충돌/교착 상태가 많이 발생합니다. 그런 경우에도 예상대로 작동하지 않습니다.iOS : LLDB 멀티 라인 브레이크 포인트 명령이 예상대로 작동하지 않습니다.

모든 셀렉터 호출에 대해 디버그 래퍼를 조합하여 특정 코드 묶음에서 메시지 호출 그래프를 추출하려고합니다. (내가 왜 당신이 정말로 알고 싶은지를 설명 할 수 있지만 디버거 문제와 관련이 없다.)

추적을 시작하려는 라인에서 Xcode 중단 점부터 시작한다. (보너스 포인트 이것은 보조 스레드에서 일어나고있는, 그러나 당신이 요청하기 전에, 아니, 다른 스레드에서 아무것도는이 개체에 액세스 또는 아무것도의 속성 서브 그래프에서) 일을하지 :

[myObject startProcessing]; 

중단 점 트리거를, 나는 실행 "bt"는 다음과 같이 추출합니다.

* thread #5: tid = 0x2203, 0x000277d2 ......... 

objc_msgSend에 중단 점을 넣습니다. 바로 실제 객체 선택기를 호출하는 명령입니다. objc_msgSend 보이는 같은 :

libobjc.A.dylib`objc_msgSend: 
...(instructions)... 
0x37babfa4: bx  r12 
...(more instructions)... 

(사실이 두 BX 호출하지만 이제을 간단하게 할 수 있습니다.) 나는 실행

breakpoint set -a 0x37babfa4 -t 0x2203 

(내가 충분히 문제가이 하나 개의 스레드를 추적하는 데 문제가 있기 때문에 TID가 포함 관련없는 작업을 방해 할 필요는 없습니다.)

여기 스크립팅이 들어 있습니다. 위에서 설명한 설정은 내가 원하는대로 작동합니다.

frame select 0 
thread step-inst -m this-thread 5 
frame info 
continue 

및 효과는 디버거 것이 될 것입니다 : 내가 브레이크 포인트 트리거 될 때까지 실행을 다시 시작, 내가 실행할 수 있습니다

  • 단계를 하나 개의 명령어로 objc_msgSend 프레임에

    • 이동, 그것을 발전
    • 은 관련 세부 정보 (개체 유형, 선택기)를 표시합니다.
    • 실행 재개

    이 시점에서 필자는 자신이 싫어할 때까지이 네 가지 명령을 반복해서 붙여 계속 출력 할 수 있습니다.

    다른 한편으로는, 내가 실행하는 경우 :

    breakpoint command add -s command 
    

    을 그 동일한 명령, 모든 나누기에 붙여 넣습니다. 객체 선택기 프레임으로 넘어 가지 않습니다. 프레임 세부 정보를 표시하지 않거나 적어도 올바른 정보는 아닙니다. 다양한 조정 (아래 참조)에 따라 "objc_msgSend"가 현재 기능으로 표시되거나 표시되지 않을 수 있습니다. 실행을 재개하지 않습니다.

    내가이 예제를 작동시킬 수 있다면, 나는 대부분 행복 할 것이다.그러나 더 많은 보너스 포인트가, 나 또한 훨씬 더 정교한 로깅을 허용 때문에 내가 선호하는 파이썬 함께이 시도하지했습니다

    breakpoint command add -s python 
    > thread = frame.GetThread() 
    > thread.StepInstruction(1) 
    > newFrame = thread.GetFrameAtIndex(0) 
    > print " " * thread.GetNumFrames() + newFrame.GetFunctionName() 
    > process = thread.GetProcess() 
    > process.Continue() 
    > DONE 
    

    을 다시 좋은. 다시 작은 세부 사항에 따라 (일반적으로 objc_msgSend)이 인쇄되거나 인쇄되지 않을 수 있지만 올바른 것을 결코 인쇄하지 않습니다. 명령을 앞으로 나아가지는 않습니다. 나중에 실행을 다시 시작하지 않습니다.

    파이썬 버전은 손으로 직접 작성하면 잘 작동합니다. 중단 점이 발생할 때까지 기다렸다가 "스크립트"를 실행하고 똑같은 줄을 입력하면 예상대로 작동합니다. 일부 부품은 별도로 작동합니다 (예 : 프로세스를 가져 와서 process.Continue()를 호출하는 부분을 제외한 모든 부분을 제거하고 자동으로 트리거하면 "작동"합니다. 즉, lldb 프롬프트가 일시 중단되고 실행을 다시 시작할 때 빠르게 깜박이는 것을 볼 수 있습니다. 응답이 없으며 곧 종료됩니다.)

    So : 어떤 아이디어입니까? 기술이 아직 준비되지 않았습니까 아니면 모든 것을 고쳐 줄 퍼즐의 영리한 부분이 없어 졌습니까? 아니면 완전히 포기하고 내가 이해할 수없는 개체 내부의 일부가 있다는 사실과 함께 살아야합니까? ...

  • +0

    LLDB로 디버깅 할 때 SO보고 문제에 대한 다른 질문이 있습니다. 내가 아는 한 가지 질문 (하지만 심판을 찾을 수 없음)은 GDB로 다시 전환 할 때 문제가 사라짐을보고합니다. 나는 아직 성숙한 제품이 아니라고 추측하고있다. –

    +0

    @PeterM : 그렇습니다. gdb가 버그가있는 데서 (결코) 많은 어려움을 겪지는 못했지만, 그 기능은 이와 같은 더 멋진 것들을 위해 훨씬 더 제한되어 있습니다. 어쩌면 다시 전환하고 몇 가지 버전에서 다시 시도해야합니다 ... – Archaeopterasa

    답변

    3

    중단 점 명령은 실행을 재개 할 수 없으며 적어도 다시는 제어권을 다시 얻을 수 없습니다. 중단 점 1이 프로세스를 실행하고 중단 점 2에 도달하면 어떤 일이 발생할지에 대해 많은 해결되지 않은 질문이 있습니다. 코드베이스가 중첩 된 중단 점을 올바르게 처리 할 수 ​​있는지에 대한 전체적인 질문 외에 (...로 설계된) 중단 점 2가 실행이 중지되어야한다고 결정하면 무엇을 의미합니까? 중단 점 1의 상태가 버려지나요?

    하위 프로세스를 스테핑하면서 브레이크 포인트를 두드리는 것에 대해 걱정할 필요가있는 것 같지만 모든 세부 사항이 해결되지 않으면 사용자가 발에서 쉽게 슛을 할 수 있습니다. 따라서 현재 중단 점 명령은 중단 점에 도달하거나 계속 실행될 때 중지 될 수 있습니다. 그러나 조금만 실행하고 더 많은 처리를 수행 할 수있는 기능은 없습니다. 나는 이것이 특정 업무를 수행하는 데 정말로 유용한 능력이 될 것이라는 것을 알고 있습니다. 그러나 할 수 있기 전에 생각해야 할 많은 어려움이 있습니다.

    경우를 들어

    , 당신이이 기능 lexer()에 의해 호출 된 경우에만 기능 parser()에 중지하려면 ... 주위를 다른 방법으로 처리 할 수 ​​있으며, 일부 lexer()에 중단 점을 넣어 쉽게 하나의 스택 프레임을 스택 위로 이동시키고 호출 함수가 무엇인지 확인하는 몇 가지 파이썬 명령. lexer()이 아닌 경우 계속하십시오. 나는 이것이 당신이하려는 일에 적용될 것이라고 생각하지 않습니다.

    관련 문제