2011-05-08 3 views
1

나는 내 매크로에서 특정 매크로/함수가 여러 번 호출되는 것을 발견해야한다. 나는 당신이 왜 find/grep을 실행하지 않을지 생각할지도 모른다는 것을 안다. 하지만 내 문제는 호출되는 함수/매크로가 특정 컴파일 타임 매크로 아래에 있다는 것입니다. 그래서이 특정 컴파일 시간 매크로를 사용할 때 호출 수를 찾으려면 싶습니다. 그리고 전체 코드에서 호출 수를 찾고 싶습니다 (런타임이 아닌 정적 분석). 코드베이스는 아주 거대하고 (수백만 줄의 코드) 리눅스에서 C 언어로되어 있습니다. readelf를 사용하려고했지만 필요한 정보를 추출 할 수 없었습니다. 어떤 도움이라도 대단히 감사하겠습니다.컴파일 시간 매크로 함수/매크로 호출 수 찾기

미리 감사드립니다. ~ N

답변

2

많은 C 컴파일러에는 관련 조건부 컴파일 기호가 정의 된 상태로 사전 처리기 중간 출력을 출력하는 플래그가 있습니다. 그러면이 출력에서 ​​find/grep을 실행할 수 있습니다.

0

해당 매크로에 과 같은 고유 한 단어 (예 : MARKER)를 삽입하고 단어가 나타나는 횟수를 계산하는 방법은 어떻습니까? 같은 코드 a.c 가정 예
, 다음

#define A f() MARKER 
#define B A; A; 
B 

마커 다음 같은 명령을 수득한다 나타나는 횟수 :의 측정 후에

gcc -E a.c | sed -r 's/[^A-Za-z0-9_]+/\xa/g' | grep MARKER | wc -l 

, MARKER을 매크로를 또는 #define을 비워서 비워야합니다.

#define MARKER 

편집 : 빌드 시스템이 make 경우, 당신은 사전 처리 된 파일을 만들 수 있도록 현재 메이크 파일에 다음 같은 새 규칙을 추가해야 할 수 있습니다 :

SRCS = a.c 

preprocessed: $(SRCS:.c=.i) 

%.i: %.c 
    $(CC) -E $(CPPFLAGS) -o [email protected] $< 

모든 설정이있는 경우를 make preprocessedfind -type f -name '*.i' 또는 이와 유사한 명령을 사용하여 을 올바르게 실행하면 전처리 된 모든 파일이 생성됩니다. 아마도 이것은 쉬운 일이 아닙니다. 어려움에 처한 경우 새 질문으로 게시하는 것이 좋습니다.

+0

감사합니다 이세, 나는 너무이 접근법을 생각했는데 파일에 "gcc -E test.c -o test.i"를 실행할 수 없으므로 사용할 수 없습니다. 몇 가지 치명적인 오류가 포함 된 파일을 찾을 수 없다는 등 .. 내 프로젝트는 꽤 많은 디렉토리를 가지고 파일을 포함하는 장소의 숫자에 퍼져있다 .. 그래서 내가 거기에 포함시킬 필요가있는 옵션이 있는지 잘 모르겠습니다. 죄송합니다, 저는 아주 사소한 질문을하고 있습니다. – Chatter

+0

흠 ... 편집을 참조하십시오. –