38

How do I stop a GDB execution without a breakpoint?

4

5 回答 5

29

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

于 2009-01-07T19:19:28.117 回答
12

GUI 应用程序不会像控制台应用程序那样对 ^C 和 ^Break 做出反应。由于现在大多数重要的项目往往是 GUI 应用程序或主要用于 GUI 应用程序的库,因此您有两种选择:

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

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

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

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

于 2011-06-27T16:17:10.140 回答
8

启动一个 shell,使用 ps 找到进程 ID,然后使用 kill 命令(例如 kill -INT pid)向它发送 SIGSTOP 或 SIGINT。

于 2009-01-07T19:45:55.583 回答
7

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

Break,当不带任何参数调用时,break 在所选堆栈帧中要执行的下一条指令处设置断点

于 2009-01-07T19:20:40.440 回答
4

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

于 2018-05-12T18:00:45.260 回答