我有一个限制,我只在我拥有的一个小 BeagleBone Black 上拥有/想要 gdbserver。基本上,某些进程崩溃了,我想在我的主机上使用 gdb 进行调试。
我希望工作流程如下:
我该怎么做?
你可以在不指定可执行文件的情况下启动gdbserver,只要你以“multi”模式启动,所以
$ gdbserver --multi :54321
将
54321
替换为您实际想要使用的任何端口。
在 GDB 端,您需要使用
extended-remote
协议进行连接,例如:
(gdb) target extended-remote hostname:54321
再次将
hostname
替换为运行 gdbserver 的主机,并将 54321
替换为用于启动 gdbserver 的端口号。
现在,您需要告诉 gdbserver 要启动哪个可执行文件,这是从 GDB 端完成的:
(gdb) set remote exec-file /path/to/exec
注意,
/path/to/exec
是远程计算机上的路径,而不是本地计算机(运行GDB的地方)上的路径,这可能意味着您需要首先将exec部署到远程。
接下来你需要告诉 GDB 你正在调试哪个可执行文件,这很糟糕,我们需要告诉 GDB 同样的事情两次,但现在就是这样,所以:
(gdb) file /local/path/to/exec
该路径是本地机器上的路径,即运行GDB的路径。 此时,您可以根据需要自由设置断点,就像在本机调试会话中一样。 准备好后,您就可以如您所愿
run
。
对上面的内容稍作调整是告诉 GDB 它需要从远程计算机获取文件。 你应该能够做到:
(gdb) file target:/path/to/exec
注意
target:
前缀,这告诉 GDB 去远程机器上查找,这里的 /path/to/exec
是远程机器上的路径。 但是,我通常更喜欢自己将文件复制到本地,然后将 GDB 指向本地计算机上的文件。 GDB 从远程计算机进行复制的速度非常慢,并且缓存(我认为)不存在,因此如果您重新启动 GDB 会话,或出于任何原因加载另一个可执行文件,GDB 将重新下载该文件。 但在紧要关头,使用 target:
路径可以帮助解决快速问题。