如何在没有断点的情况下停止GDB中的执行?

47

如何在未设置断点的情况下停止 GDB 执行?


进程是如何启动的?你是如何连接它的?默认情况下,使用 gdb --pid 连接会停止进程。你是指在按下 c 后吗? - Ciro Santilli OurBigBook.com
5个回答

36

只需使用常规中断Ctrl-c即可正常工作。 GDB将SIGINT转发到调试进程,然后该进程终止。 GDB将捕获非标准退出并在那里断开进程,因此您仍然可以检查所有线程、它们的堆栈和变量的当前值。 尽管如此,最好使用断点。 我发现自己这样做的唯一时间是,如果我认为我已经陷入某种无限循环。


我尝试了^C,但它没有起作用。我无法在提示符上输入任何内容。此外,该程序是多线程UI,这可能是问题吗? - anand
1
Ctrl-C在我的情况下起作用,但我无法在GDB 7.7.1上重现这个问题:进程似乎没有接收到Ctrl-C信号而死亡。它只被GDB停止,而不是被杀死。再次按下cdetach使其从停止的位置继续执行。 - Ciro Santilli OurBigBook.com
2
“^c” 对我没用,因为我的应用程序会捕获它并优雅地退出。还有其他建议吗? - lmat - Reinstate Monica
1
@LimitedAtonement 如果应用程序正在调用 sigwait(),则无法正常工作 - 可以参考 https://dev59.com/x2025IYBdhLWcg3wsIEU#6442197 进行解决。 - maxschlepzig

14

GUI应用程序对^C和^Break的响应与控制台应用程序不同。由于现在大多数复杂项目都倾向于是 GUI 应用程序或主要用于 GUI 应用程序的库,您有两个选择:

  1. 从单独的终端发送 SIGSTOP 信号到应用程序。这很麻烦。

  2. 如果您在 GDB 提示符上按下 ^C 或 ^Break ,GDB 将终止但应用程序将继续运行。然后您可以再次使用 -p 命令行开关运行 GDB 以附加到它。这将丢失调试器状态。

在这两种情况下,您可能会发现这个命令很有帮助:tasklist | grepProcessName| sed -e 's/ProcessName*\([0-9]*\).*/gdbModuleName-pid=\1/' > rungdb.sh 您可以修改此命令以在 shell 脚本、makefile 中使用,或者将其用于发送信号而不是附加 GDB。

info threads 将帮助您确定要查看的线程。然后使用 threadThreadNumber 切换到它。


9

打开一个shell,使用ps命令找到进程ID,然后使用kill命令发送SIGSTOP或SIGINT信号(例如:kill -INT pid)。


2
kill -STOP $(pidof processname) - Trass3r

7

只需键入BREAK而不带任何参数。

当没有任何参数调用Break时,它会在所选堆栈帧中要执行的下一条指令处设置断点。


2
在gdb的上下文中,运行、停止、单步执行是非常重要的。这正是我所需要的“停止”功能,而在gdb文档中也有关于如何终止应用程序的说明。+1 - hobb

4

对我来说 Ctrl + Z 似乎可用(但只在某些情况下 - 我不确定为什么)。


是的,Ctrl + C 对我也不起作用,所以我使用了 Ctrl + Z,然后它就可以了。 - ajaysinghnegi

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