15

我正在尝试远程调试在地址为 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 打开调试的情况下编译。我究竟做错了什么?

4

3 回答 3

13

我运行“gdb”

你应该给 GDB 你正在调试的可执行文件(最好是它的非剥离版本):

gdb /path/to/progname
(gdb) target remote 192.168.98.64:4444
于 2012-12-24T00:53:13.293 回答
6

当我使用交叉编译的 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 命令行中输入它。可选的目录行告诉它将本地源目录添加到源的搜索路径中。如果您使用指向源代码的前端,这将很有用。

于 2013-02-06T09:43:40.560 回答
5

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

  1. 启动 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
    
  2. 使用文件命令来讲述符号。

     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

于 2017-12-11T15:29:45.973 回答