【问题标题】:GDB doesn't show function namesGDB 不显示函数名
【发布时间】:2012-01-13 12:31:41
【问题描述】:

我正在使用 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 完全陌生)

【问题讨论】:

  • 你用什么标志编译的? GDB 是否知道从哪里获取您的源文件,以便它可以显示它停止所在的行?
  • 我不明白。你的电脑是ARM的?而且您似乎根本没有连接到 GDB 服务器。
  • 能否请您发布您的编译器执行行和完整的 GDB 命令?我同意 Tomalak Geret'kal 的观点,这里肯定缺少一些东西,至少连接到 GDB 服务器和设置源目录的命令。

标签: c++ gdb segmentation-fault


【解决方案1】:

您需要在构建应用时启用调试符号。 gcc 的开关是-g

【讨论】:

  • 这绝对是一方面,但与gdbserver交叉调试还有更多。 OP 尚未发布足够的信息来回答问题。
  • 我现在无法发布我使用的完整编译选项...但我使用了 -g。
【解决方案2】:

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

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。

【讨论】:

  • 我不认为这个答案是真的。我发现了几个具有可见函数名称的剥离文件(但没有可重现的源)
【解决方案3】:

您需要为每个翻译单元包含-g,例如,如果您有一堆链接到构建最终可执行文件的目标文件,您将需要为每个编译命令包含-g

g++ -g file1.cpp -c -o file1.o
g++ -g file2.cpp -c -o file2.o
...
g++ -g file1.o file2.o -o main

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    相关资源
    最近更新 更多