2016-10-07 2 views
3

큰 프로젝트> 100k loc을 단계별로 실행하려고하지만 lib와의 상호 작용에만주의해야합니다. lldb가 한 번 소스 파일에서 모든 함수 선언을 깨뜨릴 수있는 방법이 있습니까?lldb - cpp 파일의 모든 기능에 중단 점을 설정하는 방법

은 지금까지 나는 gdb to lldbgdb solution에서 정보와

br s -f <file> --func-regex .* 

일을 시도했지만 모든 함수는 4911 라인 소스 파일 5129 일치의 원인이되는 파일의 호출에 그 분할을 할 것으로 보인다.

가능한 솔루션은 함수 호출을 찾기 위해 소스 정규식 매칭을 할 수 통해

BR의 -f --source-패턴 정규 표현식

하지만 주어진 C++의 말도 구문 분석 규칙, 모든 일치하는 정규식 사례가 불가능합니다.

+0

함수 목록을 break 명령으로 파일에 넣을 수 있습니다. 헤더 파일에서 쉽게 생성 할 수 있어야합니다. gdb의 -x 플래그 사용 :'gdb -x command_file_name' – bruceg

+0

문제는 좀 더 일반적인 해결책을 원하고 헤더의 함수를 깨뜨리는 것이 함수가 헤더에 선언되지 않은 경우를 적절하게 다루지 못한다는 것입니다. 소스 파일에서 선언되고 함수 포인터로 전달 될 때. –

+0

행운을 빈다. 우리가 당신이 알아 낸 것을 알려주십시오. – bruceg

답변

2

-f 사양은 정말 <file>에 의해 정의 된 컴파일 단위에 브레이크 포인트 검색을 제한하고 당신이 가지고 그래서, 당신이 어떤 std:: 물건은 일반적으로 많이이다 사용하는 경우 그 컴파일 단위에 포함 된 모든 템플릿 인스턴스화를 포함하여 끝 발견했다.

디버거는 일반적으로 함수가 선언 된 위치 (디버그 정보의 일부 임)를 알고 있으므로 -f를 "comp unit name"이 아닌 "file of declaration"로 처리하는 옵션을 추가 할 수 있습니다. 그렇다면 다음과 같이 말할 수 있습니다.

(lldb) break set -f foo.h -f foo.cpp --match-declaration-file --func-regex .* 

추가 할 수있는 것은 꽤 간단합니다. 위급 한 경우이 효과 향상 요청을 http://bugreporter.apple.com에게 제출하십시오.

void A::foo() 
{ 
    ... 
} 

는 그런 다음 "^ {"에 소스 정규식을 수행 할 수 있습니다

당신처럼 함수를 작성의 규칙을 따르십시오. 이것이 바로이 코딩 규칙의 주된 이유 였고, 처음부터 기능을 쉽게 선택할 수있게되었습니다. 템플릿 인스턴스화는 대부분 표준에서 오는 경우

것은, 당신은 .o 인 파일을 찾을 수와 같은 (이 OS의 X에있는)을 할 수있는 : 비 표준의 목록을 생성합니다
$ nm <file-basename>.o -s __TEXT __text -j | c++filt | grep -v std 

함수를이 .o 파일에 추가 한 다음 각 줄의 시작 부분에 break set -n을 추가 할 수 있습니다.

관련 문제