2013-02-15 5 views
0

나는 Xcode의 최신 버전이 인라인 된 함수를 보여주고 인라인 코드 내에서 스테핑을 수행 할 수 있다는 것을 알고있다. std :: function을 많이 사용하는 코드를 디버깅하려고하는데 call stack과 step-in 작업이 std :: function의 모든 구현 세부 사항을 건너 뛰면 정말 좋을 것입니다. 새로운 libC++는 이러한 세부 사항을 "always_inline"속성으로 표시하여 항상 (원하는 경우 디버그 빌드에서도) 항상 인라인됩니다. 사실, std :: function 구현을 디버깅하지 않기 때문에이 함수들을보고 싶지는 않습니다. ...Xcode 디버거의 호출 스택에서 인라인 함수를 제거 할 수 있습니까?

답변

2

지금은 할 수 없습니다. 백도어에서 lldb가 스택 프레임을보고하는 방식을 바꿀 수 있습니다 (http://lldb.llvm.org/formats.html 참조) -하지만 backtrace에서 (합성 된) 인라인 스택 프레임을 표시하지 않도록 할 수는 없습니다. gdb는 디버깅 정보에서 모든 인라인 된 정보를 구문 분석하는 것을 피하기위한 설정을했습니다. 스테핑이없고 백 트레인이 없지만 lldb에 추가되지 않았습니다.

현실적으로 인라인 코드 지원 스테핑을 끄고 싶지는 않습니다. 어떤 코드가 인라인되어 있는지 식별하지 않고, "다음"또는 "스텝 오버"스테핑 모드는 인라인 코드로 무섭게 깨집니다. Xcode 4.6은 꽤 훌륭합니다. 나머지 사례는 인라인 된 코드가있는 소스 행을 "단계적으로 넘어갔습니다."컴파일러의 잘못된 디버그 정보로 인해 .h 파일의 실제 인라인 구현이 표시됩니다. 이 디버그 정보를 정확하게 얻는 것은 까다 롭지 만 대다수가 정확한 반면, Xcode 4.6을 사용하여 경우에 따라 인라인 메소드로 끝납니다. 아마도 당신이 사용하고있는 용기에 대해, 당신은 그것을 많이 쳤을 것입니다. 그러나 그것은 일반적인 경우는 아닙니다.

lldb는 bt의 출력을 사용자 정의 할 수있는 방법을 제공하지만 http://lldb.llvm.org/formats.html을 참조하십시오. 그러나 인라인 스택 프레임을 억제 할 방법은 없습니다. 파이썬에서 스택 워커를 작성하면 실제 bt과 똑같은 일을하지만 인라인 프레임은 건너 뛸 수 있습니다. SBFrame::IsInlined() 메서드를 사용하면이 작업이 간단 해집니다. 하지만 Xcode를 사용하는 경우에는 도움이되지 않습니다.

+0

ocasional "step over"버그가 나를 괴롭히지 않습니다. 내 재귀 코드를 디버깅하는 데 더 많은 관심이있어 ... 내가 바라는 건 모든 디버그 정보를 고려하지만 인라인 프레임을 필터링하고 인라인 된 코드를 통해 자동으로 단계별 처리하는 모드 인 것 같다. 실제 함수 호출에 도달했을 때). – alexk7

+0

아, 그래, 네가 뭘하고 있는지 알 것 같아. 당신은'vector.push_back'과 같은 무언가에'step'을하고 있습니다. 그리고 여러분은 실제로 그것의 인라인 된 구현으로 들어가기를 원하지 않습니다. 'target.process.thread.step-avoid-regexp' 설정을 사용해보십시오. 예를 들어'set target.process.thread.step-avoid-regexp^[^] + std :: |^std ::'in '~/.lldbinit' 파일. –

관련 문제