c++ - GDB 不显示函数名

标签 c++ gdb segmentation-fault

我正在使用 gdbserver 从嵌入式设备进行调试:

./gdbserver HOST:5000 /home/test_app

在我的PC中,我是这样执行gdb的:

arm-none-linux-gnueabi-gdb test_app

应用程序执行后,我收到要调试的 Segfault,但无法知道是哪一行产生的:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 715]
0x31303030 in ?? ()
(gdb) bt
#0  0x31303030 in ?? ()
#1  0x0000dff8 in ?? ()
#2  0x0000dff8 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

(我必须说我对 GDB 完全陌生)

最佳答案

好的,如果缺少调试符号,通常会发生这种情况...只是为了确保运行以下命令

file <your_executable>

您将获得有关您的二进制文件的信息,例如格式、arch 等。信息的最后一部分描述了二进制文件是否被剥离。为了在 GDB 中调试,不应该剥离二进制文件。

nm --debug-sym <your_executable> | grep debug

如果您有一些如下所示的有效打印,则表示存在调试符号。

00000000 N .debug_abbrev
00000000 N .debug_aranges
00000000 N .debug_frame
00000000 N .debug_info
00000000 N .debug_line
00000000 N .debug_loc
00000000 N .debug_pubnames
00000000 N .debug_str

当你调用 GDB 时,你应该有以下几行

Reading symbols from <your_executable>...done.

此时您应该可以使用 list 命令列出来源。

确保 gdb 和 gdbserver 具有相同的 versioninig。

arm-none-linux-gnueabi-gdb --version
./gdbserver --version

如果以上所有情况都是正确的,并且您仍然没有得到回溯,那么您的堆栈出现了问题。尝试在您的代码/新添加的代码上运行一些静态分析、valgrind。

关于c++ - GDB 不显示函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8390881/

相关文章:

c - GDB中遇到某个断点时如何执行特定操作?

emacs - gdb需要以root身份运行。 emacs gdb-many-windows

c++ - 段错误(核心转储)ROS c++ 箭头

c++ - main() 之前的段错误

c++ - 有没有办法在 jsoncpp 中使用变量作为键?

c - 汇编局部变量和寄存器

c - 在代码中出现奇怪的段错误

C:接收信号时段错误

c++ - 为什么 GCC -O3 在 std::deque 上使用过滤器迭代器导致无限的 std::distance?

c++ - Borland C++ 5.02 无法调用带参数的构造函数