2009-10-09 90 views
2

我目前正在調查我們的實驗室服務器上一個非常奇怪的問題。無論何時我們在安裝了Citrix訪問的64位SUSE SLES11的計算機上運行Java程序時,它都會掛起。我在機器上有最新的更新,但它沒有幫助。如果這些情況中的任何一個發生變化,它將起作用:32位操作系統,SLES10.2,通過Cygwin/Exceed和其他X應用程序(如xclock)進行訪問可以正常工作。流程執行追蹤工具

到目前爲止,這可能看起來像一個ServerFault問題,但我實際上正在尋找的是關於軟件的建議,我可以使用它來跟蹤此軟件實際正在執行的操作。它是掛在「FUTEX_WAIT」(通過使用strace發現):

futex(0x7f4e3eaab9e0, FUTEX_WAIT, 19686, NULL 

光標只是停止在跟蹤剛空後就停在那兒下去。我發現以前的bug report看起來有點類似於這個問題,但是情況非常不同。

更新:顯然,futex_wait問題是內核/ libc鎖定進程中奇怪的競態條件的跡象。我將不得不嘗試一個新的內核/ libc,看看是否有任何區別。

UPDATE2:內核/ libc更改沒有區別。沒有管理啓動jvisualvm和可預測的外部JMX端口掛,並從另一臺機器在這一點,我發現這個的線跡爲主要連接到:

Name: main 
State: RUNNABLE 
Total blocked: 0 Total waited: 0 

Stack trace: 
sun.awt.X11GraphicsDevice.getDoubleBufferVisuals(Native Method) 
sun.awt.X11GraphicsDevice.makeDefaultConfiguration(X11GraphicsDevice.java:208) 
sun.awt.X11GraphicsDevice.getDefaultConfiguration(X11GraphicsDevice.java:182) 
    - locked [email protected] 
sun.awt.X11.XToolkit.<clinit>(XToolkit.java:92) 
java.lang.Class.forName0(Native Method) 
java.lang.Class.forName(Class.java:169) 
java.awt.Toolkit$2.run(Toolkit.java:834) 
java.security.AccessController.doPrivileged(Native Method) 
java.awt.Toolkit.getDefaultToolkit(Toolkit.java:826) 
    - locked [email protected] 
org.openide.util.ImageUtilities.ensureLoaded(ImageUtilities.java:519) 
org.openide.util.ImageUtilities.access$200(ImageUtilities.java:80) 
org.openide.util.ImageUtilities$ToolTipImage.createNew(ImageUtilities.java:699) 
org.openide.util.ImageUtilities.getIcon(ImageUtilities.java:487) 
    - locked [email protected] 
org.openide.util.ImageUtilities.getIcon(ImageUtilities.java:361) 
    - locked [email protected] 
org.openide.util.ImageUtilities.loadImage(ImageUtilities.java:139) 
org.netbeans.core.startup.Splash.loadContent(Splash.java:262) 
org.netbeans.core.startup.Splash$SplashComponent.<init>(Splash.java:344) 
org.netbeans.core.startup.Splash.<init>(Splash.java:170) 
org.netbeans.core.startup.Splash.getInstance(Splash.java:102) 
org.netbeans.core.startup.Main.start(Main.java:301) 
org.netbeans.core.startup.TopThreadGroup.run(TopThreadGroup.java:110) 
java.lang.Thread.run(Thread.java:619) 

試圖在jvisualvm死鎖檢測按鈕,但它沒有發現任何死鎖。

目前正在與思傑歐洲公司討論此問題並向他們提供跟蹤信息。如果問題得到解決,會更新這個問題。

更新3:此問題已被追蹤到Citrix,並且已提交服務請求編號爲60235154.似乎問題可能是Java中的某處或此刻的Citrix實施X11中的問題。

+0

我們目前在Citrix客戶端上遇到同樣的問題。看到原來的帖子已經超過6年了,這有什麼消息嗎? – gsl 2017-02-16 16:51:28

回答

2

ltrace跟蹤共享庫函數調用。這可以讓你對事物有更高層次的看法。但是,由於許多庫函數(例如strcmp)不會導致系統調用,它也可能比strace輸出更多的輸出。

但是futex用於鎖定,所以如果你在futex卡住,你可能會死鎖。或者你只是在看一個正在等待其他線程的線程。 ltrace/strace -f跟隨clone/fork來跟蹤所有線程/所有子進程。

在gdb中,有時thread apply all <command>對於多線程進程很有用。例如thread apply all bt

1

你有沒有源代碼的Java程序?如果是這樣,您可以使用Eclipse或其他IDE登錄remotely debug。如果您沒有源代碼,您的選擇會受到更多限制,但您可以嘗試通過JConsole連接到流程,以瞭解發生的情況。 Java分析工具是另一種選擇,但難以設置。

+0

這裏的一個問題是jConsole是失敗的程序之一,否則我會這麼做。我會嘗試開始日食,但我懷疑這也會掛起。 – 2009-10-10 16:17:29

+0

您可以遠程運行JConsole。確保它是Java 6版本。 – 2009-10-11 16:50:58

+0

我們使用jconsole和jvisualvm來表明這個問題。似乎不可能將虛擬機參數傳遞給jconsole,但可以使用jvisualvm,所以我今天做了它,並在另一臺機器上掛上另一臺jvisualvm實例後遠程連接,這提供了關於可能錯誤的更多線索。用結果更新我的問題。 – 2010-01-12 12:13:28

1

也許jvisualvm與Sun的java一起提供,它具有您所需要的。您可以在程序運行時記錄虛擬機的狀態,並告訴它將任何堆棧轉儲保存到文件中,稍後您可以打開並查看該文件。在jdk的bin目錄中查找jvisualvm。 在這裏你可以看到更多的文檔: http://java.sun.com/javase/6/docs/technotes/tools/share/jvisualvm.html

祝你好運!

0

請參閱this solution我找到了。

在這種情況下,掛起是由/ dev/random中隨機字節的緩慢生成引起的。

Java應用程序等待很長時間才能獲得隨機字節。

這不是一個真正的解決方案,而是一個workarround,因爲/ dev/random將變得與/ dev/urandom相同。