Как отследить, как main вызывается с помощью gdb? - PullRequest
0 голосов
/ 28 марта 2011

Внутри main есть какая-нибудь команда, показывающая, как она вызывается?

1 Ответ

1 голос
/ 27 сентября 2011

Это может быть то, что вы ищете, если я правильно понял вопрос:

(gdb) help set backtrace past-main 
Set whether backtraces should continue past "main".
Normally the caller of "main" is not of interest, so GDB will terminate
the backtrace at "main".  Set this variable if you need to see the rest
of the stack trace.

поэтому, если вы установите его на on (и доступны данные отладки для libc, ср. этот ответ ), вы увидите стек, выглядящий так:

(gdb) where
#0  main () at ./functionPtr.c:8
#1  0x0000003c47e2139d in __libc_start_main (main=0x40052b <main>, argc=1, ubp_av=0x7fffffffde28, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,     stack_end=0x7fffffffde18) at libc-start.c:226
#2  0x0000000000400449 in _start ()

с окружающим libc-start.c кодом, похожим на это:

struct pthread *self = THREAD_SELF;

/* Store old info.  */
unwind_buf.priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf);
unwind_buf.priv.data.cleanup = THREAD_GETMEM (self, cleanup);

/* Store the new cleanup handler info.  */
THREAD_SETMEM (self, cleanup_jmp_buf, &unwind_buf);

/* Run the program.  */
result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);
...