2012-02-25 56 views
2

我有一个C++应用程序,它通过USB串行链接连接到微处理器(类似于Arduino)。我使用termios.h作为我的序列包装。进程在调试器中崩溃;我如何杀死它

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

当我:

  • cgdb build/my-process
  • 设置一些断点,等等,做一些调试
  • 发现错误,或尝试退出内部cgdb
使用 kill仍然在运行过程

该过程挂起。 cgdb拒绝永远杀死进程 - 只是坐在那里。我相当当然这是因为如果我kill从应用程序的中途,我从来没有发布我正在访问微控制器通过的/dev/ttyUSB设备。我不确定是否有东西被锁定,永不解锁,但cgdb永远不会退出。

我已经试过:

  • 基本中断:按Ctrl +ç
  • ps aux | grep 'my-process',杀-9 PID]`。
  • ps aux | grep cgdbkill -9 [pid]
  • sudo以上版本。

没有杀死cgdb或其中运行的进程。

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

你如何:(一)退出干净cgdbgdb锁定了一切,而在调试过程中,或(b)杀/干净(虽然“干净”的中间只想在锦上添花)停止一个进程,当你在调试时停止,不是响应kill -9没有重新启动?

回答

5

您不能杀死处于I/O等待状态的进程。对于大多数情况来说,如果不是所有Unix内核都是从这个时代开始就是如此。

这听起来像是一个调试器(或任何进程的另一个ptrace)卡在一个I/O等待不能被杀死,无论是。

+0

我可以设置一个超时或类似的,如果我不能彻底杀死它? – simont 2012-02-25 21:03:52

+0

不,它本质上是一个不可中断的状态。退出状态的唯一方法是成功或不成功完成内核I/O操作。 – smparkes 2012-02-25 21:07:26

+0

这是一个轻微的痛苦 - 谢谢。我一直在抨击我的头脑,试图找出如何杀死这个愚蠢的东西几天。 – simont 2012-02-25 21:16:10

0

ptrace的或p纤ep

我会尝试“p纤ep -l cgdb”上市的PID非常方便...