2009-01-07 120 views

回答

15

只需使用常规中断Ctrl - c将工作得很好。 GDB只是将SIGINT转发到调试过程,然后死亡。 GDB会捕获非标准的出口并在那里破坏进程,所以你仍然可以检查所有线程,它们的堆栈和变量的当前值。这工作正常,但你会更好使用断点。唯一一次我发现自己这样做,如果我觉得我已经陷入某种无限循环。

+0

我试过^ C但它没有工作我无法在提示符上键入任何内容。此外,该程序是多线程的用户界面,这可能是问题吗? – anand 2009-01-07 19:25:16

+0

Ctrl-C作为我想要的炒作,但我不会在GDB 7.7.1上重现这一点:该过程似乎没有得到Ctrl-C并死亡。它只被GDB阻止,没有被杀害。再次点击`c`或`detach`使它从停止的地方继续。 – 2015-05-08 10:45:03

4

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

分段,当不带任何参数调用时,断裂设置在下一个指令断点所选择的堆栈帧

4

启动一个外壳将要执行,用ps找到进程ID,并通过使用发送SIGSTOP或SIGINT kill命令(例如kill -INT pid)。

10

GUI应用程序不会对^ C和^做出反应,并且不会影响控制台应用程序的操作。这段日子以来最不平凡的项目往往是在GUI应用程序主要用于GUI应用程序或库,你有两种选择:

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

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

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

info threads将帮助你找出你想看的线程。然后使用threadThreadNumber切换到它。

相关问题