2010-08-06 1 views
2

find & grep 조합을 사용하여 파일에서 함수/구조의 사용법을 효과적으로 찾을 수 있는지 궁금합니다.grep/find 조합을 사용하여 함수 또는 구조체의 용도 찾기

예를 들어 내 컴퓨터에 git의 소스 코드가 있습니다. 당신이 commit.h 보면,이 구조가 초기화되고 그들이 어떻게 버퍼를 초기화하는 경우

struct commit { 
    struct object object; 
    void *util; 
    unsigned int indegree; 
    unsigned long date; 
    struct commit_list *parents; 
    struct tree *tree; 
    char *buffer; 
}; 

내가 밖으로 찾을 관심, commit 구조는 다음과 같이 정의되어 볼 수 있습니다. 먼저 시도해 보았습니다.

grep -rn "(struct commit)" . 

이 구조 초기화가 포함 된 파일을 제공합니다. 이제이 구조의 멤버 인 변수 buffer이 초기화 된 곳을 찾아야합니다.

grep -rn "buffer" . 

반환 값은 많은 곳에서 사용되었으며 어디에서 사용되는지 찾기가 쉽지 않습니다.

그래서 나는 기호의 사용법을 어떻게 효과적으로 알아 냈습니까? 나는 IDE가 제공하는 것에 대해 이야기하는 것이 아니라 grepfind 같은 표준 리눅스 도구를 사용하는 것에 대해 이야기하고있다. 어떻게하면 큰 코드베이스를 해킹하고 어떻게 작동하는지 이해할 수 있습니까?

답변

0

GCC 디버그 플래그 (-g)가 활성화 된 상태에서 git를 빌드하고 GDB을 사용할 수 있습니다. 거기에서 초기화 함수와 백 트레이스에 중단 점을 설정할 수 있습니다. 함수 선언 등을 따르지 않고 호출 스택에서 어떤 일이 일어나고 있는지 더 잘 이해할 수 있습니다.

10

목적에 맞게 cscope 또는 ctags를 평가 했습니까?

둘 다 vim과 emacs 모두에서 잘 작동합니다. 그들이 제공하는 주요 기능은 소스 코드에서 다른 파일에서 사용 및 정의 될 수있는 기호의 정의를 조회하는 것입니다.

나는 개인적으로 cscope http://cscope.sourceforge.net/cscope_vim_tutorial.html을 사용하며 코드를 파헤 치기 위해 아름답게 작동합니다.

+0

+1 왜냐하면 cscope를 사랑하고 VIM은 굉장합니다. – GWW

+0

고마워요. 그것은 유망한 것으로 들립니다. 나는 한번 살펴 보겠다. –

0

Kisalay에서 언급 한 cscope 및 ctags는 별개입니다.

try id-utils을 사용할 수 있습니다. VIM의 idutils를 사용할 수있는 VIM 플러그인이있을 수 있습니다. 소스 코드에서 ID 파일을 크레이트하고 매우 빠르게 검색합니다.

2

구조체의 멤버에 대한 참조를 찾는 것이 멤버가 "buffer"보다 일반적인 이름이 적은 경우 더 쉽습니다. 그러나 당신은 그것을 알고있었습니다. 당신이라는 이름의 모든 구성원에 대한 참조를 찾을 수 있습니다 그렙 단지 현대 버전을 사용

는 "버퍼"와 같은 포인터를 통해 액세스 :

grep --recursive --include=\*.c "->buffer" 

또는 로컬 인스턴스의 구성원으로 액세스 :

grep --recursive --include=\*.c "\.buffer" 

GNU grep에서 - 재귀 적으로 포함하는 것은 소스 트리를 통해 find를 올바르게 사용하는 것을 훨씬 덜 중요하게 만듭니다. (또한, 나는 인용 권리를 가지고 있다고 생각하지만, 커프에서 인용 된 쉘 인용문에주의하십시오.)

나는 권장 사항과 함께 ctags와 같은 도구에 대해 배우고 선택 편집기와 통합하는 방법에 대해 동의 할 것입니다. 이맥과 정력 모두 언뜻보기보다 훨씬 강력합니다.

2

Kscope의 분석을 보면 예를 들면, 상호 참조 방식으로 클래스와 함수의 모든 사용을 보여줍니다있는 그래픽 사용자 인터페이스와 cscope의 + ctags를 GNU GLOBAL입니다 생각 . vi 또는 emacs의 큰 팬이 아닌 경우 매우 편리합니다. 원래는 커널 소스 탐색을 대상으로했기 때문에 큰 프로젝트를 처리하는 데 아무런 문제가 없습니다.