如何在未设置断点的情况下停止 GDB 执行?
只需使用常规中断Ctrl-c即可正常工作。 GDB将SIGINT
转发到调试进程,然后该进程终止。 GDB将捕获非标准退出并在那里断开进程,因此您仍然可以检查所有线程、它们的堆栈和变量的当前值。 尽管如此,最好使用断点。 我发现自己这样做的唯一时间是,如果我认为我已经陷入某种无限循环。
c
或detach
使其从停止的位置继续执行。 - Ciro Santilli OurBigBook.comsigwait()
,则无法正常工作 - 可以参考 https://dev59.com/x2025IYBdhLWcg3wsIEU#6442197 进行解决。 - maxschlepzigGUI应用程序对^C和^Break的响应与控制台应用程序不同。由于现在大多数复杂项目都倾向于是 GUI 应用程序或主要用于 GUI 应用程序的库,您有两个选择:
从单独的终端发送 SIGSTOP 信号到应用程序。这很麻烦。
如果您在 GDB 提示符上按下 ^C 或 ^Break ,GDB 将终止但应用程序将继续运行。然后您可以再次使用 -p
命令行开关运行 GDB 以附加到它。这将丢失调试器状态。
在这两种情况下,您可能会发现这个命令很有帮助:tasklist | grep
ProcessName
| sed -e 's/
ProcessName
*\([0-9]*\).*/gdb
ModuleName
-pid=\1/' > rungdb.sh
您可以修改此命令以在 shell 脚本、makefile 中使用,或者将其用于发送信号而不是附加 GDB。
info threads
将帮助您确定要查看的线程。然后使用 thread
ThreadNumber
切换到它。
打开一个shell,使用ps命令找到进程ID,然后使用kill命令发送SIGSTOP或SIGINT信号(例如:kill -INT pid)。
kill -STOP $(pidof processname)
- Trass3r只需键入BREAK而不带任何参数。
当没有任何参数调用Break时,它会在所选堆栈帧中要执行的下一条指令处设置断点。
对我来说 Ctrl + Z 似乎可用(但只在某些情况下 - 我不确定为什么)。
Ctrl + C
对我也不起作用,所以我使用了 Ctrl + Z
,然后它就可以了。 - ajaysinghnegi
gdb --pid
连接会停止进程。你是指在按下c
后吗? - Ciro Santilli OurBigBook.com