如何在 Tomcat Catalina 上运行 strace 或 ltrace?

fla*_*ode 3 tomcat rhel5 strace

运行 ltrace 并非易事。这个 RHEL 5.3 系统基于 Tomcat Catalina(servlet 容器),它使用文本脚本将所有内容联系在一起。当我试图在这里找到一个可执行文件时,我陷入了困境:

/etc/init.d/pki-ca9 调用 dtomcat5-pki-ca9

#Path to the tomcat launch script (direct don't use wrapper)
TOMCAT_SCRIPT=/usr/bin/dtomcat5-pki-ca9
Run Code Online (Sandbox Code Playgroud)

/usr/bin/dtomcat5-pki-ca9 调用看门狗程序

/usr/bin/nuxwdog -f $FNAME
Run Code Online (Sandbox Code Playgroud)

我用包装器替换了 nuxwdog

[root@qantas]# cat /usr/bin/nuxwdog
#!/bin/bash
ltrace -e open -o /tmp/ltrace.$(date +%s) /usr/bin/nuxwdog.bak $@

[root@qantas]# service pki-ca9 start
Starting pki-ca9:              [  OK  ]

[root@qantas]# cat /tmp/ltrace.1295036985
+++ exited (status 1) +++
Run Code Online (Sandbox Code Playgroud)

这是丑陋的。如何在 tomcat 中运行 strace 或 ltrace?

更新

这是tomcat的“进程”

[root@qantas]# ps -ef | grep tomcat
pkiuser  21767 21766  0 10:10 ?        00:00:09 /usr/lib/jvm/jre/bin/java
 -Djava.endorsed.dirs=/usr/share/tomcat5/common/endorsed
 -classpath :/usr/lib/jvm/jre/lib/rt.jar:/usr/share/java/commons-
collections.jar:/usr/share/tomcat5/bin/bootstrap.jar:/usr/share/tomcat5/bin/commons-
logging-api.jar:/usr/share/java/mx4j/mx4j-impl.jar:/usr/share/java/mx4j/mx4j-
jmx.jar:/usr/share/tomcat5/common/lib/nuxwdog.jar -Dcatalina.base=/var/lib/pki-ca11
 -Dcatalina.home=/usr/share/tomcat5 -Djava.io.tmpdir=/usr/share/tomcat5/temp
 org.apache.catalina.startup.Bootstrap start
Run Code Online (Sandbox Code Playgroud)

这里是所有的孩子

[root@qantas]# pstree -A -p 21767
java(21767)-+-{java}(21768)
            |-{java}(21769)
            |-{java}(21770)
            <..snip..>
            `-{java}(22104)
Run Code Online (Sandbox Code Playgroud)

这就是我尝试在文本脚本上启动 ltrace 时发生的情况

[root@qantas]# ltrace /usr/bin/dtomcat5-pki-ca11
ltrace: Can't open ELF file "/usr/bin/dtomcat5-pki-ca11"
Run Code Online (Sandbox Code Playgroud)

当我将 ltrace 附加到父项并让它运行一天时,没有输出

[root@qantas]# ltrace -e open -o /tmp/ltrace.1295465058 -p 21767

...24 hours later...

[root@qantas]# ls -l /tmp/ltrace.1295465058
-rw-r--r-- 1 root root 0 Jan 19 11:24 /tmp/ltrace.1295465058
Run Code Online (Sandbox Code Playgroud)

Der*_*rfK 6

除非您需要在启动过程中跟踪某些内容,strace并且ltrace两者都有一个-p附加到现有进程并开始跟踪它的参数。一旦 tomcat 运行,您将从中获取进程 ID ps,然后运行

strace -p 1234 -e open -o outputfile
Run Code Online (Sandbox Code Playgroud)

或者

ltrace -p 1234 -e open -o outputfile
Run Code Online (Sandbox Code Playgroud)

其中 1234 是进程 ID。

另一个选项,如果这些“文本文件”是 shell 脚本,你应该能够

strace -f -e whatever -o whatever start-tomcat.sh
Run Code Online (Sandbox Code Playgroud)

strace 将开始跟踪为运行脚本而执行的 shell,-f 将告诉它在 fork 和执行每个命令时跟随它。您需要过滤输出以找出哪个进程是哪个程序(使用-ff而不是-f将有帮助)。