如何在 Linux 上的 main 之前查看调用堆栈

问题描述

要查看 C++ 程序(带有一个控制台应用程序和一个共享库)的启动过程,首先我在 Ubuntu 18.04 上安装了 CodeBlocks IDE,但它只将 main 显示调用堆栈中的第一个条目。

然后我使用gdb运行程序并在“_start”(应该是认的Unix应用程序入口点)然后“main”处设置一个断点,但是在“main”处中断时,backtrace命令只显示一个框架。

如何在 main 之前查看调用堆栈,以及如何为系统库的符号/源设置 dgb 以查看源?

解决方法

您需要的 GDB 设置是 set backtrace past-main on

回溯将继续经过用户入口点。

(gdb) set backtrace past-main on
(gdb) start
(gdb) bt
#0  main (argc=argc@entry=1,argv=argv@entry=0x7ffffffee1a8) at hoist.c:7
#1  0x00007fffff0802e1 in __libc_start_main (main=0x8000580 <main>,argc=1,argv=0x7ffffffee1a8,init=<optimized out>,fini=<optimized out>,rtld_fini=<optimized out>,stack_end=0x7ffffffee198) at ../csu/libc-start.c:291
#2  0x000000000800069a in _start ()

(gdb) fr 1
#1  0x00007fffff0802e1 in __libc_start_main (main=0x8000580 <main>,stack_end=0x7ffffffee198) at ../csu/libc-start.c:291
291     ../csu/libc-start.c: No such file or directory.

按照GDB complaining about missing raise.c 中的说明安装 glibc 源代码后:

(gdb) fr 1
#1  0x00007fffff0802e1 in __libc_start_main (main=0x8000580 <main>,stack_end=0x7ffffffee198) at ../csu/libc-start.c:291
291           result = main (argc,argv,__environ MAIN_AUXVEC_PARAM);