실행중에 함수 호출한 스택의 내용을 로그로 남기고 싶은데 가능

tombraid의 이미지

가능할 것 같은데.. 라고 생각만 드는데요.

실행중에 함수 호출한 스택 내용을 로그로 남기고 싶습니다.

디버거에서 bt 하면 나오는 내용 말이죠. ^^;;

A 라는 함수가 여러군데서 호출이 되는데,

그중 잘못된 인자값으로 호출하는 것 같아서 확인해 보려고 합니다.

그런데 디버거 걸어 놓고 볼수 있는 환경이 안되서요. ^^;;

위의 질문에 대한 답이나 혹시 다른 좋은 방법에 대한 조언 있으시면 알려주세요.

정태영의 이미지

소스에 접근이 가능하신가요..?
그렇다면 그 함수를 복사해다가.. 로그를 남기는 기능까지 집어넣고..

so 파일로 만든 다음에..
LD_PRELOAD 에 해당 so파일을 등록 해보심이 ;) (될지 안될지는 저도 장담은 못합니다 =3=33 )

앗 근데 이렇게 해도.. backtrace처럼 스택 상황을 볼 순 없겠군요 :roll:
Orz

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

cinsk의 이미지

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

tombraid의 이미지

제가 glibc 였으면 좋았을텐데... ^^;

솔라리스 환경이라서.. 안될것 같네요.

저도 여러군데 찾아 돌아다녔는데..

http://httpd.apache.org/dev/debugging.html#backtrace

이런게 있네요.

popen 으로 /usr/proc/bin/pstack 호출하는 방식으로 하려고 합니다.

hermian의 이미지

backtrace()를 몬타비스타 임베디드 리눅스(MIPS용)에서 사용 할 수는 없나요.
예제 파일을 컴파일 하니 개발호스트(X86)은 잘 되는데 MIPS용으로 컴파일 해서 타겟에 올리니

Obtained 0 stack frames.

으로 나오는 군요.

조언 부탁드립니다.

댓글 달기

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