[질문] ctags

naisr00t의 이미지

1.
소스를 분석할려고 하는데 저는 cscope 불편하더군요.
그러니까 소스를 보면서 특정키 가령, Ctrl + ] 등을 누르면 따라갈수 있는 것이 편한데, cscope은 그렇지 않은 듯 합니다.

2. ctags 에서 표준함수
저는 /usr/include 에서 ctags -R * 를 만들었고,
저의 source 디렉토리 /root/asi/, /root/asi/example/ 중
cats -R * 를 했습니다.
그리고 저의 .vimrc 에는 다음과 같이 설정되어 있습니다.

set tags=./tags,tags
set tags+=/usr/include/tags,/root/asi

그런데, /root/asi/example/cknull.c 소스를 분석중에 getopt() 은 따라가는데,
가령, strtol() 은 따라가지 못하더군요. 가령, printf() 또한 따라가지 못하구요.

우리가 사용하는 표준함수들 /usr/include/ 이하에 있는 모든 헤더파일을 따라갈 수 있는 방법 없나요?

3. project.vim 플러그인 사용법좀 간단히라두 알려주시면 안될까요?

서지훈의 이미지

자신이 보고자하는 소스를 한 디렉토리 안에 넣고 ctags를 돌리면 다 볼 수 있습니다.
그런데, 현재 디렉토리에 없는 소스를 볼려고 하니 당연히 안되는 겁니다.
그리고 이런 표준 함수들은 소스를 직접 구해서 보시면 되구요.
근데... 이런 표준 함수의 소스단 까지 볼 필요 까지가 있나요?
있다면 벌써 찾아서 수정 중이실거 같은데...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

Fe.head의 이미지

cscope는 ctags와 같이 사용하는것이 좋은듯 합니다.

find . -name "*.[ch]" > cscope.files
cscope -b
ctags -L cscope.files

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

naisr00t의 이미지

서지훈 wrote:
자신이 보고자하는 소스를 한 디렉토리 안에 넣고 ctags를 돌리면 다 볼 수 있습니다.
그런데, 현재 디렉토리에 없는 소스를 볼려고 하니 당연히 안되는 겁니다.
그리고 이런 표준 함수들은 소스를 직접 구해서 보시면 되구요.
근데... 이런 표준 함수의 소스단 까지 볼 필요 까지가 있나요?
있다면 벌써 찾아서 수정 중이실거 같은데...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

getopt() 는 /usr/include/sasl/saslplug.h 로 링크 됩니다.
그런데, printf() 도 /usr/include/stdio.h 에 있는데 왜 링크가 안되는 것이 궁금한거죠.

yielding의 이미지

Quote:

자신이 보고자하는 소스를 한 디렉토리 안에 넣고 ctags를 돌리면 다 볼 수 있습니다.
그런데, 현재 디렉토리에 없는 소스를 볼려고 하니 당연히 안되는 겁니다.

naisr00t님께서 설정한대로 하면 각각의 디렉토리의 tags화일을 순차적으로 검색합니다.

vim help에 보면.. (:h tags)
CTRL-] 혹은 tag {ident}는 현재 커서 및에 있는 키워드의 "definition"
으로 점프를 합니다..

그런데 /usr/include/stdio.h에는 printf등의 함수의 declaration만 있지 않나요? 그래서 못찾는거 같습니다. naisr00t님 /root/asi/example/ 이하 디렉토리에는 찾으시는 함수의 선언과 구현을 가진 h, c 화일이 다 있어서 getopt()를 찾은거 같고요..

tags만 못하지만 set path=/usr/include하셔서 원하는 원하는 signature를 가진 헤더를 gf로 열고 /\<printf\>하시는거는 어떤가요 ^^

그리고 저는 일단 .vimrc화일에
..
let _project = '~/project/p.project'
map ,p :Project <c-r>_project<cr><cr>
..
요렇게 씁니다.
p.project 화일은

yielding.Project=..../path in=in.vim out=out.vim CD=. {
      client.Files=client CD=. filter ="*.cpp" {
         a.cpp
         b.cpp
         ..
      }
      server.Files=server CD=. filter= "*.*" {
        a.cpp
        b.cpp
      }
      common.Files=common CD=. filter="*.cpp *.h" {
      }
}

그리고 in.vim, out.vim화일은 각각에 set tags등등를 설정해줄 수 있습니다..
:h project하면 그리 어렵쥐 않습니다.

Life rushes on, we are distracted

서지훈의 이미지

naisr00t wrote:
서지훈 wrote:
자신이 보고자하는 소스를 한 디렉토리 안에 넣고 ctags를 돌리면 다 볼 수 있습니다.
그런데, 현재 디렉토리에 없는 소스를 볼려고 하니 당연히 안되는 겁니다.
그리고 이런 표준 함수들은 소스를 직접 구해서 보시면 되구요.
근데... 이런 표준 함수의 소스단 까지 볼 필요 까지가 있나요?
있다면 벌써 찾아서 수정 중이실거 같은데...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

getopt() 는 /usr/include/sasl/saslplug.h 로 링크 됩니다.
그런데, printf() 도 /usr/include/stdio.h 에 있는데 왜 링크가 안되는 것이 궁금한거죠.


소스 위치는 어디죠?

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

faye의 이미지

저는 cscope만 사용하는데 불편함이 없네요.. :D

ㅎㅎㅎ 전 이렇게 사용합니다.

프로젝트 root 디렉토리에서

rm -rf cscope.*
find `pwd` -name "*.[ch]" > cscope.files
cscope -bqv -i cscope.files

해서 cscope 참조파일을 만들고...

.vimrc 파일에

cs add ./cscope.out
cs add ../cscope.out
cs add ../../cscope.out
cs add ../../../cscope.out
cs add ../../../../cscope.out
cs add ../../../../../cscope.out

를 정의해 놓으면.. 프로젝트 디렉토리 이하에선 편하게 이동해 다닐수 있더군요

(cscope plugin 넣어주면 ctrl + ] 로 함수 찾아 아닐수 있던데요?)

:wink:

naisr00t의 이미지

서지훈 wrote:

소스 위치는 어디죠?

권한은 루트로 접속했구요
/root/asi/
/root/example/
위의 두개의 디렉토리에 소스가 있습니다.

제가 잘 이해를 못 할 수도 있습니다.
이상하게
/usr/include/time.h
/usr/include/linux/time.h 이렇게 /usr/include/ 이하에 되는 것은 되고
안되는 것은 왜 안되는 것인지 모르겠네요.
굳이 printf 를 찾으려고 하는게 아니라, 왜 안되느냐는거죠?
그리고 되게 하는 방법을 없을까해서요?

ulra의 이미지

질문이 3개입니다 ^^;;;

1) ctrl + [ 이게 안되는데요 어떻게 해야 하나요?

2) 각각의 dir에 있는 tags 파일을 vi에서 자동으로 참조하게 할 수 없나요?

3) make에서 자동으로 tags 를 생성하게 하려면 어떻게 make파일을
만들어야 하나요?

OTL 즐!!!! (좌절 금지!!!)

서지훈의 이미지

1)은 이게 원래 뭐하는 명령어 인가요?
저는 t, ] 이것 밖에 안쓰는데..
2) 이건 .vimrc에서 설정을 해주는 방법 밖에 없을것 같은데요.
지난 번에도 이에 관한 쓰레드를 본것 같은데.
다른 방법이 있을 수도.
3)
tags:
@if [ "$$OSTYPE" = "FreeBSD" ] ; then \
exctags -R *; \
else \
ctags -R *.[cChH]; \
fi

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

ulra의 이미지

전 ctrl + [ 키가 ctrl + t 인지 몰랐습니다.

좋은 하루되세요.

ps: make파일은 분석하기 힘드네요. 그냥 갖다 붙이겠습니다. ^^;;

OTL 즐!!!! (좌절 금지!!!)

ulra의 이미지

안녕하세요 ^^

1) ctags를 이용해서 어떤 함수를 호출하는 함수리스트를 보는 방법 없나요?

2) ctags를 이용해서 어떤 변수를 사용하는 함수리스트를 보는 방법 없나요?

ctags로 힘들다면 다른 방법이 있으면 가르쳐주세요.

고수님의 좋은 답글을 부탁드립니다.

OTL 즐!!!! (좌절 금지!!!)

익명 사용자의 이미지

ulra wrote:
안녕하세요 ^^

1) ctags를 이용해서 어떤 함수를 호출하는 함수리스트를 보는 방법 없나요?

2) ctags를 이용해서 어떤 변수를 사용하는 함수리스트를 보는 방법 없나요?

ctags로 힘들다면 다른 방법이 있으면 가르쳐주세요.

고수님의 좋은 답글을 부탁드립니다.

ctags은 불가능하고 cscope를 이용하면 가능합니다.
그런데 귀차니즘으로 저는 그냥 find 를 사용해버립니다. ^^

ulra의 이미지

안녕하세요.

cscope로 특정 함수가 불러들이는 함수를 검색하는 기능이 있습니다.

그런데 소스상에는 분명히 불러들였는데,

검색하면 안나오는 함수가 있네요.

정밀하게 cscope를 동작하게 하는 방법 없나요?

OTL 즐!!!! (좌절 금지!!!)

pynoos의 이미지

몇몇 분께서 소개한 대로 cscope나 ctags에 파일을 넘길 때, 절대 경로를 넘기는 것이 좋습니다.

find `pwd` 로 파일들을 찾으면 절대 경로를 넘길 수 있죠.

저는 이 일을 30분에 한번씩 crontab으로 모든 프로젝트 트리와 glibc source에 대해서 tag 파일을 만들어 홈에 둡니다.

glibc 의 소스는 현재 설치된 것과 동일한 것을 받아서 풀어 놓고 필요할 때 마다 참조하는 것이 좋습니다.

처음 질문하신 분께서 제기하신 printf 등을 못찾는 것은, glibc가 weak alias를 사용하기 때문입니다.

앞에 __ 를 붙이고 시도해 보세요.

참고로 저는 printf가 #define 으로 되어 있더군요.

그리고 glibc 같은 경우는 소스안에 아키텍쳐별로 최적화된 소스가 많기 때문에 ^] 보다는 g] 를 사용하여 선택할 수 있도록하는 것이 좋더군요.

bw001730의 이미지

ctag한글 매뉴얼 없나요

Scarecrow의 이미지

Quote:

그런데, /root/asi/example/cknull.c 소스를 분석중에 getopt() 은 따라가는데,
가령, strtol() 은 따라가지 못하더군요. 가령, printf() 또한 따라가지 못하구요.

우리가 사용하는 표준함수들 /usr/include/ 이하에 있는 모든 헤더파일을 따라갈 수 있는 방법 없나요?

아래 달린 답글들 중에 해법이 없어 제가 해결한 방법을 링크해 드립니다.
저도 이 문제로 고민했었거든요. ^^

http://kldp.org/node/79117

시그너쳐: ./configure --prefix=/usr; make; sudo checkinstall

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.