2010-01-27 63 views
10

我正在尝试使用“strace -p”来连接到已运行的JBoss进程。 JBoss使用1.5.0_15 Java JDK。不幸的是,这并不工作 - 我只得到一个futex的()结果:
无法对正在运行的JBoss进程执行“strace -p”

# strace -p 3388 
Process 3388 attached - interrupt to quit 
[ Process PID=3388 runs in 32 bit mode. ] 
futex(0x8f18f7c, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...> 

strace的适用于所有其他程序而不是JBoss的。当我通过strace启动流程时,它似乎工作正常。当我尝试附加到已经运行的进程时,它不起作用。

我正在使用64位Linux 2.6.18和32位Java JDK(如果它很重要,请使用RedHat Enterprise Linux 5.3)。

更新#1:

我曾尝试用“-d”运行它,但产量不出现任何更深入的,至少对我说:


[[email protected]]# strace -d -e verbose=all -p 3388 
Process 3388 attached - interrupt to quit 
[wait(0x137f) = 3388] 
pid 3388 stopped, [SIGSTOP] 
[wait(0x57f) = 3388] 
pid 3388 stopped, [SIGTRAP] 
[ Process PID=3388 runs in 32 bit mode. ] 
futex(0x8f18f7c, FUTEX_WAIT_PRIVATE, 1, NULL 
+0

属于超级用户? – 2010-01-27 23:05:51

+0

@Aidan,我估计它应该是这里假设curious_george试图调试一些开发工作。 – 2010-01-27 23:09:19

+0

我从来没有听说过超级用户到现在为止,但要避免交叉张贴在这里我要离开这个问题。我推断大多数J2EE程序员已经在JBoss中使用了strace – 2010-01-27 23:26:43

回答

11

如果该进程中有多个线程,则需要给strace多个-p选项,指定每个选项的ID。它看起来像你正在成功地追踪原来的父线程,并且它什么都不做,只是等待其他线程完成。

(当您从strace开始命令时,它的工作原理是默认情况下,strace会选取创建的新子进程并对其进行跟踪)。

+0

I' m实际上是在跟踪子线程。虽然我确实尝试了对父线程和子线程的接口,但我没有得到任何进一步的信息。正如应该预料的那样,父线程只显示一个wait4()调用。 – 2010-01-27 23:41:37

+0

你确定*只有一个子线程?对于'java'进程来说这听起来很少(注意单个线程默认情况下不会在'ps'中显示)。看看'/ proc//task /'。 – caf 2010-01-28 00:07:23

+0

(或者试试'ps -eLm') – caf 2010-01-28 00:13:08

0

有你尝试使用strace -d -p NNN来获得一些strace调试输出?

也许添加-e详细?

已将strace安装到root用户,因此您可以查看任何进程?

+0

我曾尝试使用“-d”运行它,正如我在上面的编辑#1中所指出的那样(我看到格式化不像本节中预期的那样) – 2010-01-27 23:34:35

9

也许你可以试试这个:

strace的-F -p PID