2012-02-25 58 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非常方便...