2009-10-09 91 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相同。