进程在调试器中崩溃;我怎么杀了它

时间:2012-02-25 20:55:19

标签: macos gdb cgdb

我有一个C ++应用程序,它通过USB串行链路连接到微处理器(类似于Arduino)。我使用termios.h作为我的串行包装器。

我在Mac OS X cgdb上使用10.7.3进行调试。

当我:

  • cgdb build/my-process
  • 设置一些断点等,做一些调试
  • 使用kill
  • 中的cgdb查找错误或尝试退出仍在运行的流程

该过程挂起。 cgdb拒绝杀死这个过程 - 只是坐在那里。我相当确定这是因为如果我kill从应用程序的中途开始,我就永远不会释放我正在访问微控制器的/dev/ttyUSB设备。我不确定某些东西是否被锁定并且从未解锁,但cgdb永远不会退出。

我试过了:

  • 基本中断: Ctrl + C
  • ps aux | grep 'my-process', kill -9 [pid]`。
  • ps aux | grep cgdbkill -9 [pid]
  • 上面的
  • sudo个版本。

没有任何东西杀死cgdb或其中运行的进程。

如果我移除USB电缆(终止与微处理器的连接),(我认为这可能会导致崩溃的进程崩溃),我开始看到~50%的可用CPU被使用(不确定是什么),一切都锁定了。我设法让应用程序崩溃。

你如何:(a)干净地退出,而不是在调试流程的过程中从cgdbgdb锁定所有内容,或(b)杀死/干净(虽然'干净'只会锦上添花)停止在你调试不是的过程中停止的过程在没有重启的情况下回复kill -9

2 个答案:

答案 0 :(得分:5)

您无法终止I / O等待中的进程。对于大多数(如果不是全部)Unix内核来说,从那个时代开始就是如此。

它听起来像一个调试器(或任何ptrace另一个进程),卡在I / O等待中也不会被杀死。

答案 1 :(得分:0)

ptrace或pgrep

我会尝试“pgrep -l cgdb”非常方便列出pid ......