GDB远程调试,无法找到符号。

17

我正在尝试远程调试一个运行在192.168.98.64机器上的应用程序。在那台机器上,我运行:

gdbserver serveripaddr:4444 progname

然后从服务器上运行"gdb",在gdb提示符下运行:

(gdb)  target remote 192.168.98.64:4444
Remote debugging using 192.168.98.64:4444
[New Thread 28432]
warning: Could not load vsyscall page because no executable was specified
try using the "file" command first.
0xb775e810 in ?? ()
(gdb) break internal[TAB]

当我尝试设置断点并按TAB键时,我期望出现以"internal"开头的相应函数列表,但没有任何反应。该代码已编译并开启了-g调试功能。我做错了什么?

3个回答

15

我运行了"gdb"。

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

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

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


“symbol-file remote:[remote-path-to-binary-from-gdbserver-workdir]” 说找不到文件或目录。我已经使用“--multi”选项启动了gdbserver。 - Necktwi

6

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

  1. specify executable when starting 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. use file command to tell about the symbols.

     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:等? - 71GA
1
符号是编译成二进制(调试模式)的信息,用于将指令与代码文本关联起来。这样,在调试器中可以看到人类可读的信息。为了使其正常工作,您必须使用“-g”进行编译,并在源目录中,以便“gdb”可以找到由调试二进制文件指向的源文件。 - Mohammad Azim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接