流程执行跟踪工具(Process execution tracing tools)

2019-08-17 15:33发布

我目前在我们实验室的服务器上调查一个非常奇特的问题的过程。 每当我们与已经与Citrix访问的64位SUSE SLES11安装的机器上运行Java程序,它只是挂起。 我在机器上的最新更新,但它并不能帮助。 如果上述任何情况发生变化,它的工作原理:32位操作系统,SLES10.2,通过Cygwin访问/超越和其他X应用程序,如XCLOCK做工精细。

这可能看起来像一个ServerFault问题,到目前为止,但什么我其实要找的是软件的建议我可以用它来追踪一下这个软件实际上是做什么。 它是挂在“FUTEX_WAIT”(通过使用发现strace的 ):

futex(0x7f4e3eaab9e0, FUTEX_WAIT, 19686, NULL

光标只是停止在刚刚NULL后的痕迹,只是在那里停留下去。 我发现了一个以前的bug报告 ,看起来有点类似于这样的问题,但情况有很大的不同。

更新:显然,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 java.lang.Object@1c190c99
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 java.lang.Class@308a1f38
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 java.util.HashMap@3c07ae6d
org.openide.util.ImageUtilities.getIcon(ImageUtilities.java:361)
   - locked java.util.HashMap@1c4c94e5
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死锁检测按钮,但它发现没有死锁。

目前谈论到Citrix欧洲关于这个问题,并提供跟踪他们。 如果它得到解决会更新这个问题。

更新3:这个问题已经被追踪到Citrix和已提交与服务请求数60235154.好像问题是无论是在Java的地方或在思杰对X11的实现的时刻。

Answer 1:

ltrace痕迹共享库函数调用。 这可以给你的东西更高级别的视图。 但它也可以喷出万吨,比strace的多个输出,因为很多库函数(例如STRCMP)不会导致系统调用。

但futex的用于锁定,因此,如果您感到迷惑futex的,你可能陷入僵局。 或者,你只是在寻找一个线程正等待其他线程。 ltrace / strace的-f如下克隆/叉来跟踪所有线程/所有子进程。

在gdb,有时thread apply all <command>为多线程进程是有用的。 例如thread apply all bt



Answer 2:

你有没有为Java程序的源代码? 如果是这样,你可以远程调试使用Eclipse或其他IDE它。 如果你没有源代码,你的选择是比较有限的,但你可以尝试通过连接到过程JConsole中获得一些洞察到发生了什么。 Java的分析工具是另一种选择,但难以成立。



Answer 3:

也许jvisualvm,附带了Sun的java的,有你需要的东西。 为您的程序正在运行,您可以录制虚拟机的状态,并告诉它保存任何的堆栈转储到一个文件以后可以打开看看。 寻找你的JDK的bin目录jvisualvm。 在这里你可以看到更多的文档: http://java.sun.com/javase/6/docs/technotes/tools/share/jvisualvm.html

祝好运!



Answer 4:

使用gdb来连接到进程。 GDB不完全是直观的,但也有很多的HOWTO,并在网络上类似。

http://dirac.org/linux/gdb/06-Debugging_A_Running_Process.php



Answer 5:

见这个解决方案我已经找到。

在这种情况下挂起通过缓慢代从/ dev /随机的随机字节而引起的。

对于很长一段时间的Java应用程序等待获得随机字节。

这是不是一个真正的解决方案,而是一个workarround因为在/ dev /随机将成为同为/ dev / urandom的。



文章来源: Process execution tracing tools
标签: java linux trace