GDB远程调试,好像找不到符号

Posted

技术标签:

【中文标题】GDB远程调试,好像找不到符号【英文标题】:GDB remote debugging, can't seem to find symbols 【发布时间】:2012-12-10 11:01:17 【问题描述】:

我正在尝试远程调试在地址为 192.168.98.64 的机器上运行的应用程序。在我运行的那台机器上:

gdbserver serveripaddr:4444 程序名

然后我从服务器运行“gdb”,然后在 gdb 提示符处运行:

(gdb) 目标远程 192.168.98.64:4444 使用 192.168.98.64:4444 进行远程调试 [新线程 28432] 警告:无法加载 vsyscall 页面,因为未指定可执行文件 首先尝试使用“文件”命令。 0xb775e810 在?? () (gdb) 内部中断[TAB]

在尝试设置断点以显示以 internal 开头的相应函数列表时,我希望按下 TAB 键,但它没有显示任何内容。代码已在使用 -g 打开调试的情况下编译。我做错了什么?

【问题讨论】:

【参考方案1】:

我运行“gdb”

您应该将您正在调试的可执行文件提供给 GDB(最好是未剥离的版本):

gdb /path/to/progname
(gdb) target remote 192.168.98.64:4444

【讨论】:

【参考方案2】:

我自己在使用交叉编译的 gdb 时遇到了这个问题(如果你的远程主机有不同的架构,你通常会需要这个)。在这种情况下,需要从远程主机上编译的二进制文件中读取符号。我发现以下对我有用(如果主机上的架构相同):

在远程主机上:

gdbserver [host]:[port] [remote-path-to-binary-from-gdbserver-workdir]

然后在(交叉编译的)gdb 中的本地主机上:

shell sleep 5
target remote [host]:[port]
symbol-file remote:[remote-path-to-binary-from-gdbserver-workdir]
directory [local-root-directory-for-source-files]
continue

[*] 替换为您的数据。您可以将它用作 gdb 脚本(因此在第一行中使用 sleep)或在 gdb 命令行中输入它。可选的目录行告诉它将本地源目录添加到源的搜索路径中。如果您使用指向源代码的前端,这将很有用。

【讨论】:

【参考方案3】:

在远程调试时,gdb 客户端不知道从哪里加载符号。你有两个选择:

    启动 gdb 时指定可执行文件

     gdb <executable>
     (gdb) target remote <IP>:<port>
     (gdb) load <executable>
      gdb should know symbols now
     (gdb) b main
     (gdb) mon reset
     (gdb) continue
      it should break at main
     (gdb) bt
    

    使用文件命令来讲述符号。

     gdb
     (gdb) target remote <IP>:<port>
     (gdb) load <executable>
     (gdb) file <executable>
      gdb should know symbols now
     (gdb) b main
     (gdb) mon reset
     (gdb) continue
      it should break at main
     (gdb) bt
    

PS:确保你已经编译了带有调试符号-g -O0的可执行文件

【讨论】:

如果我在编译时不使用-g,那么我只能通过我手动定义的标签移动。调试符号到底是什么? GDB 是否为源文件的每一行创建标签1:2:3:...? 符号是编译成二进制(调试模式)以将指令与代码文本相关联的信息。这样您就可以在调试器中看到人类可读的信息。为此,您必须使用-g 编译并位于源目录中,以便gdb 可以找到调试二进制文件指向的源文件。

以上是关于GDB远程调试,好像找不到符号的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse 调试:远程调试时找不到源

visualstudio远程调试找不到ip

使用GDB进行嵌入式远程调试

嵌入式Linux的GDB远程调试如何实现呢?

Visual Studio + 远程 gdb 调试

一文掌握vscode远程gdb调试