【问题标题】:How to see the call stack before main on Linux如何在 Linux 上查看 main 之前的调用堆栈
【发布时间】:2021-04-06 09:09:38
【问题描述】:

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

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

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

【问题讨论】:

  • main 从 Crt0 调用。 Crt0 的代码是开源的(在GCCGNU libc 中)。另请阅读与您的架构相关的 ABI 规范(例如,this 用于 x86-64)

标签: c linux gdb startup crt


【解决方案1】:

你需要的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>, argc=1, argv=0x7ffffffee1a8, init=<optimized out>,
    fini=<optimized out>, rtld_fini=<optimized out>, 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>, argc=1, argv=0x7ffffffee1a8, init=<optimized out>,
    fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffffffee198) at ../csu/libc-start.c:291
291           result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-03
    • 2017-01-26
    • 1970-01-01
    • 2019-04-06
    • 2017-08-05
    • 2012-07-07
    • 2012-01-24
    • 2023-04-06
    相关资源
    最近更新 更多