현재 실행되고 있는 함수이름을 알고 싶은데...
글쓴이: bugger / 작성시간: 금, 2003/12/05 - 10:26오후
안녕하세여..
예를 들어..
------------------------------------------
void sub_test()
{
}
void test()
{
sub_test();
}
int main()
{
test();
}
-------------------------------------
이런 프로그램이 실행되고 있고 실행하고 있는 지점이 sub_test라는 펑션에서 실행되고 있다고 가정하면스택에는 main- test-sub_test 네임이
있을것입니다..
스텍에 있는 main-test-sub_test라는 값을 얻어오는 방법이 없다요?
-.-;;
좋은 하루보네세요
Forums:


OS, 컴파일러를 알려주시면 많은 분들이 답해주시리라 믿습니다.
OS, 컴파일러를 알려주시면 많은 분들이 답해주시리라 믿습니다.
OS는 리눅스, 솔라리스이고 컴파일러는 gcc 또는 g++입니다.
OS는 리눅스, 솔라리스이고 컴파일러는 gcc 또는 g++입니다.
아.. OS나 컴파일러의 차이도 있군여... -.-;;
[code:1]$ cat dumpstack.c#include <
$ cat dumpstack.c #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> struct _functions { void * addr; char name[512]; struct _functions * next; }; static struct _functions * s_funcs; static void release_funcs() { struct _functions * p = 0; struct _functions * q = 0; if( !s_funcs ) { return; } for( p = q = s_funcs; p; p = q ) { q = p->next; free( p ); } }void build_symbols() { char buf[4096]; FILE *f; struct _functions * p = 0; snprintf( buf, sizeof buf, "ps | grep %d | awk '{print \"nm -Cn\", $NF}' | sh", getpid() ); f = popen( buf, "r" ); while( fgets( buf, sizeof buf, f ) ) { char func[4096]; long addr; char type; if( buf[0] == ' ' ) { continue; } sscanf( buf, "%lx %c", & addr, &type ); strncpy(func, buf + 11, sizeof func ); func[strlen(func)-1] = '\0'; if( type != 't' && type != 'T' ) { continue; } if( !s_funcs ) { s_funcs = ( struct _functions * ) calloc( 1, sizeof( struct _functions )); p = s_funcs; } p->addr = (void *) addr; strncpy( p->name, func, sizeof p->name ); p->next = ( struct _functions * ) calloc( 1, sizeof( struct _functions )); p = p->next; } pclose(f); atexit( release_funcs ); } static const char * get_func_name( void * addr ) { struct _functions * p = 0; for( p = s_funcs; p->next; p = p->next ) { if( p->addr <= addr && p->next->addr >= addr ) { return p->name; } } return "????"; } void dump_stack() { int stackcount = 0; unsigned long * addr; system("set"); if( !s_funcs ) { build_symbols(); } if( !s_funcs ) { abort(); } asm ( "mov %%ebp, %0" : "=r" (addr) : ); for( stackcount = 0; ; stackcount++ ) { const char * func = get_func_name((void *)*(addr+1)); printf( "%d: %s\n", stackcount, func ); addr = (unsigned long *)(*addr); if( strcmp( func, "_start" ) == 0 ) { return; } } }저도 평소에 필요해서 만들어 볼까도 했는데, 문제를 보고 한번 살짝 구현해보았습니다.
Linux 에서만 됩니다. inline asm 있어서...
사용법은 main 들어가자마자 build_symbols() 한번 호출해주고, 원하는 곳에서 dump_stack(); 을 호출하면 됩니다.
외부 프로그램으로 nm을 사용하는 것에 의존하므로, libc의 함수등은 trace되지 않습니다.
참고로 header는 없는데,
void build_symbols();
void dump_stack();
을 만드시고, C++ 이라면, Name mangling을 피하기 위해 앞에 extern "C" 등을넣어 주시면 됩니다.
근데 이게 원하는 답인가요?
---
http://coolengineer.com
원하시는 용도정도라면, target os가 리눅스와 솔라리스이니.. 오히
원하시는 용도정도라면, target os가 리눅스와 솔라리스이니.. 오히려, 간단하게 pstack 명령어로 하는게 낫지 않을까요??
--------------------------
Donghyun Jung
pstack .. 이런 좋은것이 있었군요.. 8) 아.. 시간낭비.
pstack .. 이런 좋은것이 있었군요.. 8)
아.. 시간낭비.. 아까워라..
---
http://coolengineer.com
^^
제가 이전에 작성한 글인데,
아마 이거면 될듯하네요..
이지도움에 글이 있는데 저것은 12월 12일 이후에나 보일껍니다..
http://www.ezdoum.com/stories.php?story=02/10/04/0839023
울랄라~ 호기심 천국~!!
http://www.ezdoum.com
움..pynoos 님... 역시 대단합니다. 존경~~예효
움..
pynoos 님... 역시 대단합니다. 존경~~
예효.. 난 언제나... 될까... -.-;;
간단히 함수 이름을 아는 방법이 있습니다.C99 표준 문서를 보면
간단히 함수 이름을 아는 방법이 있습니다.
C99 표준 문서를 보면요.. 6.4.2.2에.. 미리 정의된 식별자 이야기 가 있는데요...
static const char __func__[] = "함수이름";
#include <stdio.h>
void myfunc(void)
{
printf("%s\n", __func__);
/* ... */
}
위의 결과로..
myfunc
가 출력됩니다.
간단하죠?? ^^;;
그 질문이 아닌거 같은데요..?
그 질문이 아닌거 같은데요..?
오.. 멋지네요. 유용한 팁이군요. :)
오.. 멋지네요.
유용한 팁이군요. :)
평온하다~
[code:1]printf("Function name i
printf("Function name is \"%s\"\n", __FUNCTION__);* VC6에서 안 먹습니다.
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
댓글 달기