gpt4 book ai didi

c++ - 为什么在执行 "gdb"命令后 "start' 列出多个函数,即使 C++ 源文件不包含任何函数?

转载 作者:行者123 更新时间:2023-12-03 07:00:39 25 4
gpt4 key购买 nike

上下文
考虑以下文件

$ cat main.cpp
int main() {return 0;}
我可以通过执行列出所有可用的功能
$ g++ -g main.cpp && gdb -q -batch -ex 'info functions -n' a.out
All defined functions:

File main.cpp:
1: int main();
执行 start 时执行前 info functions列出了 1000 多个函数(见下文)
g++ -g main.cpp && \
gdb -q -batch -ex 'start' -ex 'info functions -n' a.out | \
head -n 10
Temporary breakpoint 1 at 0x111d: file main.cpp, line 1.

Temporary breakpoint 1, main () at main.cpp:1
1 int main() {return 0;}
All defined functions:

File /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/allocated_ptr.h:
70: void std::__allocated_ptr<std::allocator<std::_Sp_counted_ptr_inplace<std::filesystem::__cxx11::filesystem_error::_Impl, std::allocator<std::filesystem::__cxx11::filesystem_error::_Impl>, (__gnu_cxx::_Lock_policy)2> > >::~__allocated_ptr();
70: void std::__allocated_ptr<std::allocator<std::_Sp_counted_ptr_inplace<std::filesystem::filesystem_error::_Impl, std::allocator<std::filesystem::filesystem_error::_Impl>, (__gnu_cxx::_Lock_policy)2> > >::~__allocated_ptr();
如下所示,打印的总行数是如此,显然,列出了 1000 多个函数
g++ -g main.cpp && gdb -q -batch -ex 'start' -ex 'info functions -n' a.out | wc -l
4436
问题
正如我们在上面看到的, main.cpp文件不包含任何函数,为什么是 gdb列出这些函数时 start命令已在之前执行过,但在 start 时未执行没有被执行?
附加上下文
正如此问题的评论之一所建议的,这是执行 info shared 的输出之后 start已被执行
g++ -g main.cpp && gdb -q -batch -ex 'start' -ex 'info shared' a.out
Temporary breakpoint 1 at 0x111d: file main.cpp, line 1.

Temporary breakpoint 1, main () at main.cpp:1
1 int main() {return 0;}
From To Syms Read Shared Object Library
0x00007ffff7fd2090 0x00007ffff7ff2746 Yes (*) /lib64/ld-linux-x86-64.so.2
0x00007ffff7e4c040 0x00007ffff7f37b52 Yes /usr/lib/libstdc++.so.6
0x00007ffff7c7f3b0 0x00007ffff7d1a658 Yes (*) /usr/lib/libm.so.6
0x00007ffff7c59020 0x00007ffff7c69ca5 Yes /usr/lib/libgcc_s.so.1
0x00007ffff7ab3650 0x00007ffff7bfe6bd Yes (*) /usr/lib/libc.so.6
(*): Shared library is missing debugging information.

最佳答案

main.cpp file does not contain any function, so why is gdb listing those functions when the start command has been executed before but not when start hasn't been executed?


之前 start , GDB 仅为主可执行文件读取符号(和调试信息)。
start ,动态链接的可执行文件加载共享库(见 info shared),GDB(默认情况下)读取每个符号表和调试信息。由于这些库包含数百个函数,GDB 知道所有这些。
您可以使用 set auto-solib-add off 防止这种情况发生,但通常你不想这样做。如果你这样做了,你的程序就会崩溃,例如 abort , 除非您使用 sharedlibrary 手动添加符号,否则 GDB 将不知道您崩溃的位置。或 add-symbol-file command .

关于c++ - 为什么在执行 "gdb"命令后 "start' 列出多个函数,即使 C++ 源文件不包含任何函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64102746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com