가능할 것 같은데.. 라고 생각만 드는데요.
실행중에 함수 호출한 스택 내용을 로그로 남기고 싶습니다.
디버거에서 bt 하면 나오는 내용 말이죠. ^^;;
A 라는 함수가 여러군데서 호출이 되는데,
그중 잘못된 인자값으로 호출하는 것 같아서 확인해 보려고 합니다.
그런데 디버거 걸어 놓고 볼수 있는 환경이 안되서요. ^^;;
위의 질문에 대한 답이나 혹시 다른 좋은 방법에 대한 조언 있으시면 알려주세요.
소스에 접근이 가능하신가요..? 그렇다면 그 함수를 복사해다가.. 로그를 남기는 기능까지 집어넣고..
so 파일로 만든 다음에.. LD_PRELOAD 에 해당 so파일을 등록 해보심이 ;) (될지 안될지는 저도 장담은 못합니다 =3=33 )
앗 근데 이렇게 해도.. backtrace처럼 스택 상황을 볼 순 없겠군요 :roll: Orz
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~ 나 한줄기 바람처럼..
glibc를 쓴다면, backtrace를 출력하는 함수를 만들 수 있습니다.
아래 내용을 backtrace.c에 저장하고, 컴파일하고 실행한 결과입니다 (주의, 시스템에 따라서 아래와 같이 linker에 -E 옵션을 주어야 합니다.)
$ gcc -g -Xlinker -E backtrace.c $ ./a.out Obtained 7 stack frames. ./a.out(print_trace+0x19) [0x804878d] ./a.out(dummy_function3+0xb) [0x8048808] ./a.out(dummy_function2+0xb) [0x8048815] ./a.out(dummy_function1+0xb) [0x8048822] ./a.out(main+0x15) [0x8048839] /lib/libc.so.6(__libc_start_main+0xc0) [0x40039460] ./a.out [0x80486d1] $ _
backtrace.c의 코드입니다:
#include <execinfo.h> #include <stdio.h> #include <stdlib.h> /* Obtain a backtrace and print it to `stdout'. */ void print_trace(void) { void *array[10]; size_t size; char **strings; size_t i; size = backtrace(array, 10); strings = backtrace_symbols(array, size); printf("Obtained %zd stack frames.\n", size); for (i = 0; i < size; i++) printf("%s\n", strings[i]); free(strings); } /* Dummy functions to make the backtrace more interesting. */ void dummy_function3(void) { print_trace(); } void dummy_function2(void) { dummy_function3(); } void dummy_function1(void) { dummy_function2(); } int main (void) { dummy_function1(); return 0; }
자세한 것은 "info libc backtrace"해 보시면 나옵니다. :P
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html Korean Ver: http://cinsk.github.io/cfaqs/
제가 glibc 였으면 좋았을텐데... ^^;
솔라리스 환경이라서.. 안될것 같네요.
저도 여러군데 찾아 돌아다녔는데..
http://httpd.apache.org/dev/debugging.html#backtrace
이런게 있네요.
popen 으로 /usr/proc/bin/pstack 호출하는 방식으로 하려고 합니다.
backtrace()를 몬타비스타 임베디드 리눅스(MIPS용)에서 사용 할 수는 없나요. 예제 파일을 컴파일 하니 개발호스트(X86)은 잘 되는데 MIPS용으로 컴파일 해서 타겟에 올리니
Obtained 0 stack frames.
으로 나오는 군요.
조언 부탁드립니다.
텍스트 포맷에 대한 자세한 정보
<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]
소스에 접근이 가능하신가요..?그렇다면 그 함수를 복사해다가.. 로그
소스에 접근이 가능하신가요..?
그렇다면 그 함수를 복사해다가.. 로그를 남기는 기능까지 집어넣고..
so 파일로 만든 다음에..
LD_PRELOAD 에 해당 so파일을 등록 해보심이 ;) (될지 안될지는 저도 장담은 못합니다 =3=33 )
앗 근데 이렇게 해도.. backtrace처럼 스택 상황을 볼 순 없겠군요 :roll:
Orz
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
glibc를 쓴다면, backtrace를 출력하는 함수를 만들 수 있습니
glibc를 쓴다면, backtrace를 출력하는 함수를 만들 수 있습니다.
아래 내용을 backtrace.c에 저장하고, 컴파일하고 실행한 결과입니다 (주의, 시스템에 따라서 아래와 같이 linker에 -E 옵션을 주어야 합니다.)
backtrace.c의 코드입니다:
자세한 것은 "info libc backtrace"해 보시면 나옵니다. :P
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
답변감사합니다.
제가 glibc 였으면 좋았을텐데... ^^;
솔라리스 환경이라서.. 안될것 같네요.
저도 여러군데 찾아 돌아다녔는데..
http://httpd.apache.org/dev/debugging.html#backtrace
이런게 있네요.
popen 으로 /usr/proc/bin/pstack 호출하는 방식으로 하려고 합니다.
montavista embeded linux에서 이용할 수 있는 방법은?
backtrace()를 몬타비스타 임베디드 리눅스(MIPS용)에서 사용 할 수는 없나요.
예제 파일을 컴파일 하니 개발호스트(X86)은 잘 되는데 MIPS용으로 컴파일 해서 타겟에 올리니
Obtained 0 stack frames.
으로 나오는 군요.
조언 부탁드립니다.
댓글 달기