strace调试tomcat
今天碰到一个底层问题,需要使用strace调试运行在tomcat容器下web服务对操作系统调用,google了好多博客都没有完整的答案,东拼西凑加上不断尝试,总算找到办法。
Step1: 找到tomcat进程ID
-bash-4.2# ps aux|grep -v grep|grep tomcat|awk '{print $2}'|head -n1
25253
Step2: strace附加到进程
strace -f -p 25253 -T -tt -o /var/logs/strace.log
参数说明:
- -p {pid},调试正在运行的进程
- -f 跟踪子线程,一定要打开,否则就只能看到FUTEX_WAIT一条信息,猜测原因tomcat是通过子线程完成web请求的,主进程都是wait状态。
- -T显示每个调用的耗时,调试信息最后一个尖括号<>,单位是秒,例如<0.002616>。
- -tt显示调用的时间,具体到微秒。-t显示调用时间到秒。可以和其他日志匹配问题发生时间,很关键。
- -o trace输出文件。
示例:
[pid 75799] 10:10:07.842021 <... write resumed> ) = 2296 <0.101173>
[pid 75794] 10:10:07.842036 restart_syscall(<... resuming interrupted call ...> <unfinished ...>
[pid 75756] 10:10:07.842051 <... restart_syscall resumed> ) = -1 ETIMEDOUT (Connection timed out) <0.012292>
[pid 75755] 10:10:07.842078 futex(0x7f2420030654, FUTEX_WAIT_PRIVATE, 3, NULL <unfinished ...>