如何终止gdbserver?

25

我正在尝试使用gdbserver进行调试。在主机上终止gdb客户端后,我发现gdbserver仍在监听:

Remote side has terminated connection.  GDBserver will reopen the connection.
Listening on port 5004

我尝试了从任何地方找到的所有方法来退出gdbserver,但都没有成功:quit,exit,q,monitor exit,Esc,Cnt+c...什么都不能停止它。而且,当我打开另一个终端并使用ps、top命令查找正在运行gdbserver的进程时,我在那里找不到它...我的问题是如何终止gdbserver?

8个回答

26

下达指令

monitor exit

如果您已经终止了客户端,请在终止之前从主GDB分离。

如果您还没有终止它,只需使用另一个客户端附加到它即可。


3
连接使用 extended-remote 时工作。 - Sandeep Datta
@SandeepDatta 你是对的,这是详细的步骤:https://dev59.com/eWEi5IYBdhLWcg3w4PhB#44162888 - Ciro Santilli OurBigBook.com

4

监控退出 逐步操作

https://dev59.com/eWEi5IYBdhLWcg3w4PhB#23647002提到了这个方法,但这是你需要的完整设置。

远程:

# pwd contains cross-compiled ./myexec
gdbserver --multi :1234

本地:

# pwd also contains the same cross-compiled ./myexec
gdb -ex 'target extended-remote 192.168.0.1:1234' \
    -ex 'set remote exec-file ./myexec' \
    --args ./myexec arg1
(gdb) r
[Inferior 1 (process 1234) exited normally]
(gdb) monitor exit

测试过适用于Ubuntu 14.04。


2

在 Linux 上编写:

ps -ef |grep gdbserver

现在找到gdbserver进程的pid,然后…
kill -9 <pid>

5
是的 - 我知道如何终止进程。但我想以正常的方式从gdbserver退出,就像使用q退出gdb一样。 - yehudahs
1
看起来这是从远程目标终止它的唯一方法。而且 ctrl+z 也不起作用,所以你必须从另一个会话登录来完成此操作。 - wisbucky

2

gdbserver 运行在目标设备上,而不是主机上。

终止它的方法取决于目标设备。例如,如果你的目标设备是类UNIX系统,你可以远程登录并从目标设备的 shell 中使用 ps 和 kill 命令。

对于任何类型的目标设备,重新启动设备即可终止 gdbserver

(如果这些信息还不足以回答你的问题,请在问题中提供更多关于目标设备的信息。)


是的 - 我已经尝试了以上所有方法,也尝试在目标设备上使用ps和top来查找gdbserver进程,但没有成功...我的机器运行的是“Linux version 2.6.32-71.el6.x86_64 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC) ) #1 SMP Wed Sep 1 01:33:01 EDT 2010”。 - yehudahs

1

这是我使用的脚本,用于通过ssh启动gdb服务器,并在必要时使用ctrl+c关闭它。

#!/usr/bin/env bash

trap stop_gdb_server INT

function stop_gdb_server {
    ssh remote-srv-name "pkill gdbserver"
    echo "GDB server killed"
}

ssh remote-srv-name "cd /path/to/project/dir/ && gdbserver localhost:6789 my-executable"

0

退出 [表达式]


退出GDB,请使用quit命令(缩写为q),或键入文件结束字符(通常为C-d)。如果您不提供表达式,GDB将正常终止;否则,它将使用表达式的结果作为错误代码终止。


这会停止本地的gdb,但不会停止远程多模式下的gdb。 - Rick

0
我要写另一个答案,因为这些答案对我的情境/使用场景来说都没有任何意义。
所以,假设你处于一个正常的桌面环境中,你打开了一个终端并运行了类似以下的命令:
gdbserver localhost:5000 ./myapp

也许你是在使用VS Code进行调试或者其他操作。无论如何,现在你的终端上有一个进程一直运行着,无论你按多少次Ctrl+C都无法关闭它。那么,你该如何摆脱它呢?
答案是:在一个新的终端中运行以下命令:
gdb -ex 'target extended-remote localhost:5000'

gdb 可能会打扰你一些你不关心的废话 - 只需按下回车键,直到看到一个提示符说 (gdb)。现在在这个内部 gdb 命令提示符下输入 monitor exit。第一个终端窗口中的 gdbserver 应立即退出(第二个终端中不会收到任何反馈)。
要退出第二个终端中的 gdb,请输入命令 q。你可能需要多次执行此命令。或者直接关闭终端。

-2

当您的目标退出时,gdbserver应该退出。问题是您的目标如何退出:

  1. 什么也不做:只是跳过
  2. 在主函数中返回0
  3. 在主函数中使用exit(0)

从我运行的调试会话中看,在第一种情况下,gdbserver将不会退出。它将永远挂起,您必须杀死它。在后两种情况下,gdbserver将退出。


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