How to Debug Tuxedo™ Server 戴冠平 客户支持部

How to Debug
Tuxedo™ Server
戴冠平
客户支持部
© 2003 BEA Systems, Inc.
内容提要
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
¾ 基本日志分析
• 单步调试
• 动态跟踪
• 紧急情况分析
© 2003 BEA Systems, Inc.
Company Confidential
2
最简单有效的习惯-应用输出
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 程序代码中打印数据
– printf(“Input data is: %s”, inputStr);
– fprintf(stdout, “Input data is %s”, inputStr);
– fprintf(stderr, “Input data is %s”, inputStr);
– printf(“Return data is: %s”, outputStr);
– tpreturn(TPSUCCESS, outputStr, …..)
• 客户端在Console上
• 服务端检查stdout和stderr文件,输出被重定
向
© 2003 BEA Systems, Inc.
Company Confidential
3
利用上Tuxedo的函数-Buffer跟踪
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• userlog (char *, ...)
– #include <userlog.h>
– 和printf()的格式一样
– 在ULOG文件中输出
(FLDID(167772170))
570
(FLDID(167773761))
fjdsaskf
FILESIZE
9660
BLOCKNUM
1
BLOCKSIZ
100
FILENAME
• Fprint()/Fprint32()
– 将FML/FML32中的数据逐ID打印
– 在stdout文件中输出
– 可以通过Fprintf()/Fprintf32()输出到指定文件
© 2003 BEA Systems, Inc.
Company Confidential
4
利用上Tuxedo的工具-功能测试
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• ud/ud32/wud/wud32 < {Input Data File}
– 比如 ud32 < getClientIP.txt
• 输入数据为FML格式的字段和值
• 输出也为服务器处理结果的FML数据
输入:getClientIP.txt
输出:控制台
SRVCNM
.TMIB
RTN pkt(4) is :
TA_CLASS
T_CLIENT
TA_ERROR
0
TA_OPERATION
GET
TA_MORE
0
TA_OCCURS
1
TA_CURCONV
0
TA_CURREQ
1
TA_CURTIME
1053430806
© 2003 BEA Systems, Inc.
…….
Company Confidential
5
利用上Tuxedo的工具-功能测试
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• Jolt Repository Editor
© 2003 BEA Systems, Inc.
Company Confidential
6
打开Tuxedo调试开关-TMTRACE
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 打开跟踪调试信息
– TMTRACE=(atmi+xa+iatmi|*):ulog:dye
– chtr on/off在tmadmin中
061829.xxx!jfkserver.107216: gtrid x0 x3c877b5c x5:TRACE:xa: { xa_start(0x200137dc, 0, 0x0)
061829.xxx!jfkserver.107216: gtrid x0 x3c877b5c x5:TRACE:xa: } xa_start = 0
061829.xxx!jfkserver.107216: gtrid x0 x3c877b5c x5:TRACE:at: { tpservice({"jfk_cardused", 0x10,
0x200ee560, 1060, 0, -1, {0, -2, -1}})
061829.xxx!jfkserver.107216: gtrid x0 x3c877b5c x5:TRACE:at: { tpreturn(2, 0, 0x200ee560, 0, 0x0)
061829.xxx!jfkserver.107216: gtrid x0 x3c877b5c x5:TRACE:xa:
{ xa_end(0x200137dc, 0, 0x4000000)
061829.xxx!jfkserver.107216: gtrid x0 x3c877b5c x5:TRACE:xa:
} xa_end = 0
061829.xxx!jfkserver.107216: TRACE:at:
} tpreturn [long jump]
061829.xxx!jfkserver.107216: TRACE:at: } tpservice
061829.xxx!TMS_ORACLE.118254: gtrid x0 x3c877b5c x4:TRACE:xa: { xa_prepare(0x20008f3c, 0, 0x0)
© 2003 BEA Systems, Inc.
Company Confidential
7
如何看ULOG
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• ULOG
– 时间戳/进程号/线程/上下文
• 174011.xxx!TMS_ORA.5437.1.0: LIBTUX_CAT:262:
INFO: Standard main starting
– 错误信息目录及编号
• http://e-docs.bea.com中TUXEDO文档内Message连接
1398
© 2003 BEA Systems, Inc.
WARN: tpforward called outside service routine
Description
tpforward() was called in an invalid context.
Action
Modify the application code calling
See Also
tpforward(3c)
Company Confidential
tpforward().
8
内容提要
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 基本日志分析
¾ 单步调试
• 动态跟踪
• 紧急情况分析
© 2003 BEA Systems, Inc.
Company Confidential
9
编译带调试信息的可执行文件
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 在UNIX上,带上“-g”选项编译程序
– buildserver –f “-g” –f simpserv.c –o simpserv –s TOUPPER
– 最终调用CC
– 可以设置CFLAGS变量
• 在Windows上,带上“/Zi /Od”选项编译程序
– buildserver –f “/Zi /Od” –f simpserv.c –o simpserv –s TOUPPER
– 最终调用CL
© 2003 BEA Systems, Inc.
Company Confidential
10
保留Tuxedo的main函数
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 编译时设置“-k”选项,保留Tuxedo应用服务的
main()函数
– buildserver –k –f “-g” –f simpserv.c –o simpserv –s TOUPPER
int
#ifdef _TMPROTOTYPES
main(int argc, char **argv)
#else … #endif
{
#ifdef TMMAINEXIT
#include "mainexit.h"
#endif
return( _tmstartserver( argc, argv, _tmgetsvrargs()));
}
© 2003 BEA Systems, Inc.
Company Confidential
11
以Debug模式启动Tuxedo应用
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 以tmboot中的-d1选项启动该应用Server
$ tmboot -d1 -s simpserv
INFO: BEA Tuxedo, Version 8.0, 32-bit, Patch Level 153
INFO: Serial #: 650522264137-933467316566, Expiration 2003-07-31, Maxusers 10000
INFO: Licensed to: BEA Internal use only
Booting server processes ...
exec simpserv -C dom=simpapp -g 1 -i 1 -u bea-cs -U /home/gpdai/tux/ULOG -m 0 -A :
process id=19897 ... Started.
1 process started.
• 注意记下进程号,也可用PS查
© 2003 BEA Systems, Inc.
Company Confidential
12
绑定可执行文件与进程
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 使用gdb/dbx/vc++等调试工具将硬盘上的可执
行文件和内存中的进程绑定在一起调试
– 比如HP-UX:gdb simpserv <pid>
– 比如Windows:msdev –p <pid>
© 2003 BEA Systems, Inc.
Company Confidential
13
设置断点
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 打开源代码文件,在想跟踪的语句上设置断
点,通常设在SERVICE的入口处
– (gdb) break TOUPPER
– Breakpoint 1 at 0x2b90: file simpserv.c, line 56.
© 2003 BEA Systems, Inc.
Company Confidential
14
触发-看发生了什么?-Win
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 执行“simpcl just_a_test”
© 2003 BEA Systems, Inc.
Company Confidential
15
触发-看发生了什么?-Unix
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
© 2003 BEA Systems, Inc.
Company Confidential
16
内容提要
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 基本日志分析
• 单步调试
¾ 动态跟踪
• 紧急情况分析
© 2003 BEA Systems, Inc.
Company Confidential
17
他们正在干什么?-tmadmin
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• tmadmin
–
–
–
–
© 2003 BEA Systems, Inc.
pq观察队列堵塞
psr/psc观察服务状态
pt观察事务状态
pclt观察客户端状态
Company Confidential
18
他们正在干什么?-tmadmin(pic)
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 应用
© 2003 BEA Systems, Inc.
Company Confidential
19
他们正在干什么?-truss
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 用truss –f –p <pi>等来跟踪系统调用
1319:
1319:
1319:
1319:
1319:
1319:
1319:
1319:
1319:
1319:
1319:
1319:
1319:
1319:
1319:
2609:
……
2609:
2609:
2609:
2609:
2609:
1319:
2609:
© 2003 BEA Systems, Inc.
msgrcv(7327, 0x0010A788, 1556, -1073741824, 0) (sleeping...)
msgrcv(7327, 0x0010A788, 1556, -1073741824, 0)
= 532
pathconf(".", _PC_PATH_MAX)
= 1024
stat64("./", 0xEFFF81A0)
=0
stat64("/export/home/appuser/bin", 0xEFFF8108)
=0
getuid()
= 1003 [1003]
door_info(4, 0xEFFF5218)
=0
door_call(4, 0xEFFF5200)
=0
sigaction(SIGINT, 0xEFFF7CB8, 0xEFFF7D38)
=0
getrlimit(RLIMIT_NOFILE, 0xEFFF7D78)
=0
times(0xEFFF72D0)
= 91640398
times(0xEFFF6A30)
= 91640398
pipe()
= 8 [9]
pipe()
= 10 [11]
fork1()
= 2609
fork1()
(returning as child ...)
= 1319
close(10)
Err#9 EBADF
getuid()
= 1003 [1003]
setsid()
= 2609
execve("/export/home/oracle/OraHome1/bin/oracle", 0x000C6948, 0xEFFFFAA8) Err#2 ENOENT
write(11, " N T P 2 0\n", 7)
=7
read(10, " N T P 2 0\n", 64)
=7
_exit(0)
Company Confidential
20
内容提要
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 基本日志分析
• 单步调试
• 动态跟踪
¾ 紧急情况分析
© 2003 BEA Systems, Inc.
Company Confidential
21
Core Dump了?!
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 在ULOG中定位异常的服务
174011.xxx!BBL.4098.1.0: LIBTUX_CAT:541:
WARN: Server GROUP_XX/30001 terminated
• 在硬盘上有core文件,可以通过
strings/gdb/dbx来分析
© 2003 BEA Systems, Inc.
Company Confidential
22
怎么Core Dump的?
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 应用CORE DUMP问题
– 用dbx/gdb分析CORE文件
• dbx 服务进程执行文件 core
• dbx>where
$ gdb odclient core
Detected 64-bit executable.
Invoking /opt/langtools/bin/gdb64.
HP gdb 2.1
Copyright 1986 - 1999 Free Software Foundation, Inc.
© 2003 BEA Systems, Inc.
Company Confidential
23
怎么Core Dump的!
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
(no debugging symbols found)...#0 0xc000000000c66118 in memmove () from
/usr/lib/pa20_64/libc.2
(gdb) where
#0 0xc000000000c66118 in memmove () from /usr/lib/pa20_64/libc.2
#1 0x4000000000002bd0 in BILLINFO ()
#2 0xc00000000007eeb4 in _tmsvcdsp () from /home/tuxedo/lib/libtux.sl
#3 0xc000000000096c84 in _tmrunserver () from /home/tuxedo/lib/libtux.sl
#4 0xc00000000007e3b8 in _tmstartserver () from /home/tuxedo/lib/libtux.sl
#5 0x40000000000021e8 in main ()
(gdb)
© 2003 BEA Systems, Inc.
Company Confidential
24
如何临时补救?
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 可以配置Restart来暂时缓解
– S1 GRACE=3600 RESTART=Y MAXGEN=10
174011.xxx!BBL.4098.1.0: LIBTUX_CAT:557: INFO:
Server GROUP_XX/30001 being restarted
© 2003 BEA Systems, Inc.
Company Confidential
25
Q&A
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
• 谢谢您
© 2003 BEA Systems, Inc.
Company Confidential
26