【问题标题】:Missing symbol names in gdbserver but not with gdbgdbserver 中缺少符号名称,但 gdb 中没有
【发布时间】:2013-10-30 15:36:13
【问题描述】:

我想开始使用 gdbserver 进行远程调试,因此我在我的本地机器上使用一个简单的测试程序测试了它的功能,该程序会生成如下所示的段错误:

segfault.c -- 编译为名为“test”的elf

#define NULL ((void*)0)
int main()
{
    int value = *((int*)NULL);
    return value;
}

现在当我跑步时:

#gdb test

(gdb)run

我明白了:

Starting program: /home/awaibel/digiworkspace/test/Debug/test 

Program received signal SIGSEGV, Segmentation fault.
0x080483bf in main () at ../segfault.c:4
4       int value = *((int*)NULL);

但是,如果我像这样使用 gdb 服务器调试它:

#gdbserver :65535 test

#gdb test

(gdb)target remote 127.0.0.1:65535

(gdb)continue

它给了我调试信息:

Program received signal SIGSEGV, Segmentation fault.
0x080483bf in ?? ()

似乎为段错误提供了相同的函数地址,但是在使用远程调试器进行调试时省略了名称和行号。是否可以让远程调试器显示此信息,如果可以,如何显示?

我想我应该补充一点,该程序是使用“-g”调试标志使用 GCC 编译的

【问题讨论】:

  • 当我重复你的步骤时,即使使用 gdbserver (0x000000000040047b in main () at segfault.c:4),我也会得到预期的结果。您使用的是什么平台(操作系统和架构)和 GDB 版本?
  • gdb --version 给GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04 gdbserver --version 给GNU gdbserver (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04 平台是Xubuntu 12.04 x86
  • 看起来符号没有加载
  • 我是否必须在 gdbserver 调用中添加一些内容才能加载符号?
  • 执行符号解析的是“客户端”端的 gdb。 gdbserver 只知道地址。当您使用“gdb test”启动 gdb 时,您应该会看到类似“Reading symbols from test...done.”这样的行。你看到了吗?

标签: c debugging gdb gdbserver


【解决方案1】:

感谢 markys 的 cmets,我能够找出问题所在。由于 gdb 客户端解析符号而不是服务器,因此我必须确保客户端知道可执行文件副本的完整路径。由于“test”不在用于运行 gdbtest 的命令提示符的当前目录中,因此它没有要使用的符号副本。将二进制文件添加到运行客户端的终端的 PATH 解决了该问题。谢谢。

总结:

  • 服务器端:

gdbserver --multi :port "path-to-executable"

  • 客户端:

gdb "路径到可执行文件" (gdb)> 目标远程“ip-of-the-remote-device:port”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多