함수를 부르는 함수 찾기에 대한 질문 입니다.

hyper9의 이미지


C 언어를 사용해서 program을 작성할 때, aaaa()라는 function을 부르는 function이

a111(), a222(), a333(), a444()...., a999()..
등등인 경우에 aaaa()를 호출하고 있는 function이 누구인지 쉽게 알아내는 방법이 없을까요?

간혹은 이런 경우에 calling function을 찾는데 시간이 많이 걸려서 다른 분들의 know-how를 배우고자 합니다.
조언 부탁드리겠습니다. ^^

vacancy의 이미지


cscope에 그런 기능이 있는 것으로 알고 있습니다.

자세한 방법은 다음 분께서 해주실 .. ( -_);;

leboum의 이미지

소스 인 사이트 편집기 써보세요...

drinkme의 이미지

runtime에 호출측을 알고 싶다는 질문인가요?

x86에서는 stack을, arm에서는 link register를 검사해서
호출측의 영역에 주소와 비교하면 됩니다.

Hyun의 이미지

실행 중 함수의 backtrace를 보려면 libc의 backtrace 류의 함수를 사용할 수 있습니다.
ctags는 함수의 선언을 찾을 수 있는데, 호출하는 곳은 찾을 수 없습니다. 대신 grep를 사용할 수 있는데, 속도가 느립니다. 대신, 위에서 말씀하셨던 cscope를 사용하실 수 있습니다.
cscope는 vim에서 plugin을 사용해 쉽게 사용하실 수 있으며, :cs find g 등으로 사용하실 수 있습니다.


나도 세벌식을 씁니다
sohn9086의 이미지

vim + cscope에서 특정 함수를 호출하는 곳을 찾을 때는

:cs find c 함수명

입니다.

:cs find g 함수명

은 그 함수가 정의된 곳을 찾습니다. 함수 내부가 어떻게 구현되었는지 보고싶을 때 사용하죠.

참고로, 함수포인터를 경유해서 그 함수가 불리어질 경우에는

:cs find c 함수명

으로 검색이 되지 않습니다. 그럴땐,
:cs find s 함수명

으로 그 함수명과 일치하는 심볼을 모두 찾아내는 게 좋을 때가 있습니다.

그 이외에 제가 자주 사용하는 기능들입니다.

:cs find d 함수명  -> 지정된 함수가 그 안에서 부르는 함수 찾기(Find functions called by this function)
:cs find e 정규표현식 -> 정규표현식 패턴으로 찾기 (Find this egrep pattern)
:cs find f 파일명 -> 파일 찾기(Find this file)
:cs find i 헤더파일 -> 헤더파일 찾기(Find files #including this file)

근데 말이죠, ":cs find "를 일일이 입력하기가 상당히 귀찮거든요. 그래서, cscope홈페이지에 가보시면, vim용 키맵 플러그인 파일이 있습니다.

http://cscope.sourceforge.net/cscope_maps.vim

이걸 vim플러그인 디렉토리에 복사해 두시면 커서 밑에 있는 단어를 주워서 검색할 수 있습니다. 예를 들어 커서를 foo라는 단어에 둔 상태에서 "Ctrl-백슬래쉬 g" 라고 입력하면, ":cs find g foo"를 실행해 줍니다.

저는 "Ctrl-백슬래쉬" 마저도 귀찮아서 그걸 F11로 매핑해 씁니다...

귀차니즘은 모든 개발자의 미덕이죠...(퍽)
--------------
save the earth

생산적인 댓글을 달자

auditory의 이미지

원글과는 관계없지만, 한가지 질문드려봅니다.

혹시 cscope.out 파일을 자동으로 검색하게 할 수 있는 방법 아시나요?

예를 들어 ctags의 tag파일 같은 경우는 .vimrc 파일에

set tag=./tags;/

라고 쓰면 현재 디렉토리에 tags가 없으면 상위디렉토리로 하나씩 올라가면서 찾게 되는데요.

cscope에서는 이걸 하려면 어떻게 하나요??

따로 글타래를 만들어야할까요?

sohn9086의 이미지

제가 위에서 말씀드린 cscope_maps.vim파일을 열어보면 아시겠지만, vim실행시에 cscope.out을 찾습니다.
먼저 현재 디렉토리에서 찾고, 없으면 환경변수 CSCOPE_DB로 지정된 패스에서 찾나보네요.
전 항상 작업중인 소스트리의 제일 상위 디렉토리에서 cscope 데이터베이스 파일을 만들고, 그 디렉토리에 있는 아무런 소스파일 하나를 vim으로 열어서 작업을 시작합니다.
--------------
save the earth

생산적인 댓글을 달자

auditory의 이미지

그렇게 할 수도 있겠군요..

그런데 저는 vimrc에서 autochdir을 on시켜놓고 쓰다보니, cwd가 계속 바뀝니다.

이런 경우에 상대적인 디렉토리를 제대로 해석해서 이동하는 것을 못하는군요..

autochdir은 디렉토리별로 make파일이 있어서 이동한 후에 make하거나,

:e 로 같은 디렉토리의 다른 파일을 열거나 할 필요가 있어서 on 시켜놓고 씁니다.

autochdir도 되면서 cscope도 잘 쓸 수 있으면 좋겠는데 일단 하나만 선택해야겠군요..

sohn9086의 이미지

vim에 autochdir 이라는 기능이 있는 줄은 몰랐습니다. 감사합니다.
그렇지만, 전 디렉토리 이동이나 다른 파일 열기를 할 때 :E 로 하다보니 autochdir 을 쓰지않아도 그리 불편한지는 모르겠네요.
autochdir 을 켜더라도 cscope 인덱스파일을 모두 절대경로로 작성하면 아마 문제없이 쓰실 수 있을 겁니다.
--------------
save the earth

생산적인 댓글을 달자

auditory의 이미지

진짜로 오프토픽이지만,
저는 :E 를 몰랐습니다.. ^^;;
:E를 쓴다면 autochdir을 안 써도 될것 같네요.. 역시 지식은 나누어야.. ^^

Hyun의 이미지

전 $HOME/.vimrc 에서 cs add cscope.out 해놓고 씁니다.


나도 세벌식을 씁니다
kiban18의 이미지

저도 예전부터 궁금해하던건데 오늘에서야 답을 찾게 되었네요..

http://vim.wikia.com/wiki/Autoloading_Cscope_Database

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.