2014-11-09 40 views
1

我的項目基本上是一個像lync一樣的通信客戶端,它是用JAVA爲前端(GUI)開發的,並使用特定於平臺的本地(C或C++)代碼來運行服務。爲什麼使用JAR應用程序的GDB調試本機代碼在命中斷點時會掛起Ubuntu UI(X11進程)?

現在,在Linux上(Ubuntu 12.04),一旦JAR應用程序被調用,它將加載所有本地代碼共享庫並開始執行UI線程。在UI中完成的任何操作都會將事件引發到C中的本地代碼。因此,當前我需要在C/C++用戶庫中調試崩潰,當我在UI下拉菜單中執行某些操作時會觸發該事件。

我正在使用GDB連接到進程的PID(sudo gdb -p),所有的符號都被加載了,我可以在庫中設置一個函數斷點A()。之後在GDB中繼續執行命令,我從UI下拉列表中選擇實例,並在函數A()處命中斷點。在這一刻,我的Ubuntu機器掛起,沒有鍵盤中斷正在工作。我只能移動我的鼠標指針,但不能點擊任何東西。

但是,要驗證內核是否關閉,我可以ping機器,甚至可以使用SSH。一旦SSH調用相同的GDB,就不會遇到上述問題。任何人都可以請在這裏幫我解釋爲什麼UI或X11過程在上述場景中掛起。

PS:是的,有很多線程在運行,它可能是一個線程死鎖的情況,但是當SSH終端調用GDB時它不會發生。

感謝和問候, 因陀羅

+0

這有幫助嗎? [在X11上調試彈出菜單和類似組件時掛起](https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-Desktop/html/awt.html#gdadua) – 2014-11-09 15:34:08

回答

2

爲什麼UI或X11過程中,上面的場景

正如馬克Plotnick期間掛起正確地指出的那樣,X11過程確實掛起。相反,它抓住了keybard(所有鍵盤事件都派發給它),並且不能釋放該抓取(它在到達釋放點之前由GDB停止)。

常見的有兩種解決方案:

  1. 要求應用程序not do the keyboard grab(如馬克說),或
  2. 調試從一個單獨的機器上的應用程序(這甚至可以單臺物理機上完成的:剛在VM內運行應用程序)。

P.S.爲什麼應用程序菜單抓住鍵盤?因爲打Esc通常會關閉菜單,並且他們希望看到Esc,而不管應用程序是否具有輸入焦點)。

+0

非常感謝。這些信息有助於理解背後的用戶應用程序。 – 2014-12-04 17:48:40

相關問題