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远程调试,好像找不到符号的主要内容,如果未能解决你的问题,请参考以下文章