最近工作涉及到分析core dump文件发现这个好帖就当仁不让地转到偶博客了O(∩_∩)O~
PS:
Where can you get dbx?
It is part of bos.adt.debug
# lslpp -w /usr/bin/dbx
File Fileset Type
-------------------------------------------
/usr/bin/dbx bos.adt.debug Symlink
以下转自http://www.aixchina.net/?6141/viewspace-18882
I core dump 分析入门
AIX专家俱乐部E ?!CR8Z#S)[
环境变量设置
`#X`4\]9h|8]0
;Uy%D]6sQ.i9O0 可以通过 /etc/security/limits 文件对各用户的基本配置参数包括 core 大小进行限制。或者通过 ulimit 更改当前环境下的 core 大小限制。AIX专家俱乐部vF?I9u:B1@]!HC
c\!v_J-r)r3U0 默认情况下应用进程生成 core dump 时都使用文件名 core。为了避免同一工作目录下的进程 core 相互覆盖可以定义环境变量 CORE_NAMING=true然后启动进程这样将生成名为 core.pid.ddhhmmss 的文件。可以使用 file core 命令查看 core 是哪个进程产生的。
:EvFu#O@$n*s)g0AIX专家俱乐部0U(p#k2_:J/} G"v$D.E
默认情况下应用进程 dump 时会包含所有的共享内存如果 dump 时想排除共享内存内容可以在启动进程之前设置环境变量 CORE_NOSHM=true.
R1I rjg0
9kkS%v!@6o0 系统有一个参数 fullcore 用于控制是否在程序 coredump 时生成完整的 core。为避免信息丢失建议打开 fullcore。可以使用 lsattr –El sys0 查询是否将 fullcore 打开使用 chdev -l sys0 -a fullcore=true 将 fullcore 状态更改为打开。也可以在程序内部调用 sigaction 例程设置 fullcore参考如下测试程序AIX专家俱乐部~*Pp~3Qi
@4L3gNuy_0fullcore 设置示例 AIX专家俱乐部n4m4E,c/{ ewz
8g|9zx9Gv'F0//test.CAIX专家俱乐部5D@)bx*?)F
#include <iostream>AIX专家俱乐部?&Q'NC!rB*ox
#include <signal.h>
BY@esPG0AIX专家俱乐部nAZ4@gzd7{(K
int main(int argc, char* argv[])AIX专家俱乐部4s$Q0QY5j6N)?6Z,M/z
{
[-lfWBAL0 char str[10];AIX专家俱乐部J&Bo'CS5q
struct sigaction s;
azZqqo-oWO-f?0 s.sa_handler = SIG_DFL; AIX专家俱乐部t"?:[j h,jD
s.sa_mask.losigs = 0;
4L7nMMB#k lI0 s.sa_mask.hisigs = 0;
-C9fo RnP k%M(NN0 s.sa_flags = SA_FULLDUMP;AIX专家俱乐部4REO"xg
sigaction(SIGSEGV,&s,(struct sigaction *) NULL); AIX专家俱乐部5h`};avp
AIX专家俱乐部)?#dh%SE.H)v
std::cout << " input str!\n" << std::endl;AIX专家俱乐部sdR bJn
std::cin >> str;AIX专家俱乐部SHF2S-A8_q
return 0;
2{Cw\QTA0}AIX专家俱乐部+j+xYc-bM~
|
AIX专家俱乐部KQ0i.jDAE
#O&m+H2}*G0 寻找 core dump
}0v5Qh!fhZ0AIX专家俱乐部(lJ4QZdD)nEV
应用进程的 core 产生在其当前工作目录下可以在应用程序内部使用 chdir 函数切换当前工作目录。使用 procwdx 命令可以查看进程的当前工作目录。系统的 core 生成在 lg_dumplv 下并在重启时转移到 /var/adm/ras/ 目录下如果有足够空间的话否则继续保留在 lg_dumplv并随时有可能被覆盖。
@8o3`A/Y;N8JZQ*p0AIX专家俱乐部;?8z~Us9WaG
可以使用 errpt -a 查看标识 C0AA5338 SYSDUMP系统 core、B6048838 CORE_DUMP进程 core的详细错误信息获取生成 core 的进程以及 core 文件位置。使用 snap –ac 收集系统的 dump 信息。
QDCZo|#G6[0AIX专家俱乐部-[4`\s+jO%sL
core dump 信息收集 AIX专家俱乐部;} G!J,R-C_!@
+JR6c,p?-o5_?1}0 如果可能 , 直接在发生 coredump 的机器上用 dbx 分析出结果 , 这样是最方便的分析方法 . 这种情况下注意不要直接以 root 用户登录然后用 dbx 分析 , 而必须在应用程序所属的用户下进行此操作 , 因为 core 可能需要依赖应用程序运行时对应环境下的某些库 , 这样就要借助应用程序的环境变量 .
xW2^wVZ%P8G;k)el0
1ApsXSv_0 如果需取回生产机上的 core 信息在实验室分析 , 则需要搜集一些相关信息 . 进程 core 分析一般至少需要依赖应用可执行程序有时还需要包括一些运行时动态库信息。如果需要收集 core 相关的完整信息可运行 snapcore <core 路径以及名称 > < 可执行文件以及名称 >例如 snapcore ./core ./a.out然后在 /tmp/snapcore 下取下相应的 .pax.Z 文件。AIX专家俱乐部 i'H+v,xpYU*f
:t,cu1A1qGZ]W s0 正常的收集过程应该如下 :
Y3l }JF8{},A"t+]p0
yWi*JU0snap core 收集过程 AIX专家俱乐部!E5_Wriw\
AIX专家俱乐部F)k;n`%q*U
# snapcore ./core ./a.out
7BO ?I8T7i,].\4J S~0Core file "./core" created by "a.out"
'qO,Q Vy0
'nc#nNd] |,c Zj5h0pass1() in progress ....
YMXw(sZY i0AIX专家俱乐部3F'F#eRq n"W%E&p#W
Calculating space required .AIX专家俱乐部*_vDLjZ!P?8ne
AIX专家俱乐部b kR(x&D
Total space required is 14130 kbytes ..
!}"u.o-BHu@SVH0
2lrX.Ol)Cq R0 Checking for available space ...AIX专家俱乐部4H^2e9_^0kGX?7i
AIX专家俱乐部{)hBo[ov~
Available space is 807572 kbytesAIX专家俱乐部)L%DFS(j
;{;ec+mci0pass1 complete.
bcfkhI:Z [J:iL"_N0
2| z)~X!P9X'C0pass2() in progress ....
'W7o$`!?'f[0
$@?6y;wCF0 Collecting fileset information .AIX专家俱乐部0Xl'p7\7`-d
7a!I`Yc0 Collecting error report of CORE_DUMP errors ..
"z}%c%MR0|s0AIX专家俱乐部0| _u5\2L_)\
Creating readme file ..AIX专家俱乐部O\c6`s$Z,d
AIX专家俱乐部R p#M.p$H;{He
Creating archive file ...
T3z4hK#u0AIX专家俱乐部)]/Bw y4K
Compressing archive file ....
NU:]'WLzw$z3\+p0
gab lD3}D'r3T0pass2 completed.
lXUP*Wd*T,?X0AIX专家俱乐部+{/HfVM
Snapcore completed successfully. Archive created in /tmp/snapcore.
"~Z5{,o3PW0
.WQZY8k0H0# cd /tmp/snapcoreAIX专家俱乐部mh]l*}\pN
# ls
:p,vX%uG%x0snapcore_352276.pax.ZAIX专家俱乐部)B3S.]9HJ+cv7r
# uncompress snapcore_352276.pax.ZAIX专家俱乐部2f{1^(Gk8?
# ls
w#G&E*A}$Y3g0snapcore_352276.pax
-Jjkw%nI:@0# pax -r -f snapcore_352276.paxAIX专家俱乐部l-`%uz{;\5s
# ls 注意需要保证有类似如下文件 ( 可执行文件/core/errpt/lslpp/usr 目录等 ):
h s.v1? ncdC0README errpt.out usr
2_+H0N m/l]!k0a.out lslpp.out
,Db'O r9gX-C0core snapcore_352276.pax
R3Hd3O(?4Y4?0#
(w9ecg(yt;c4f0v0 |
AIX专家俱乐部+WQqW.{Kqh$MamH
AIX专家俱乐部G N8o5{8FNLK/^
II 使用 dbx 分析 core dump 的例子
X b]4?6Q7`xJ0
^4`!I$`C4h}0dbx 是 AIX 下基于命令行界面的源码级调试工具。本文档只提供一些基本的 dbx 分析指令详细内容请参考“General Programming Concepts: Writing and Debugging Programs”关于 dbx 的描述。
WI1h_EHi0
t&k8QtJf g0 初步分析
j@ zf)aIQ0
7Zj2IP%Pw0#dbx <program name> core
4W7iacY+`M0
|
AIX专家俱乐部4~IP i6z^b;L1[9t
7?V\rA(c]0 示例AIX专家俱乐部a}8Z*mY3g"K
# dbx ./test coreAIX专家俱乐部5V}%c7uW
Type 'help' for help.AIX专家俱乐部:[&en`Ld
warning: The core file is not a fullcore. Some info may
+B R&Mj4|xW4GHD,D0not be available.AIX专家俱乐部%H3\Z&Di0TGS[s)if
[using memory image in core]AIX专家俱乐部:\s&n:b ^*RhX-b5zP
reading symbolic information ...warning: no source compiled with -g
,I"v0O.@Dz0AIX专家俱乐部0sle/jh6X j
Segmentation fault in raise at 0xd022e1e4AIX专家俱乐部|_`UU;R%V0nu
0xd022e1e4 (raise+0x40) 80410014 lwz r2,0x14(r1)AIX专家俱乐部vf3Nn"j y4@ Y
|
eSjTK@s}x\0
(S,NS6m,N)|+Q:@']0 显示出 core 发生时当前进程执行到的位置-g 编译的情况下能够看到具体的行AIX专家俱乐部S1\U#F;~
(dbx) where
C'k%~-l/q:bL%@0raise(??) at 0xd022e1e4
-ELn8i9P1uA^O0main(0x1, 0x2ff22d48) at 0x100019c4AIX专家俱乐部be~+a!]|js
|
Bzutk(M3Z0
?)Z*EF*v'uD2w0 注意AIX专家俱乐部E;pL4@n/^ N}
j Xu fnH0 如果分析的是异地 core 文件需要采用 snapcore 收集相关 core 信息。对于依赖链接库的情况注意需要增加 -p ldpath=newpath:...
重新设置链接库路径只有所有依赖的库都已经被链接才能完整的复现 coredump 故障现场参考 dbx 的帮助文档获取更多信息。
f#E^p3L0
# cd /tmp/snapcore
Zs6lq6i0# dbx –p /=./ a.out core
F.cfX\!A"Y c0Type 'help' for help.
7R r c!M"[m6D0[using memory image in core]
Qt)]:Olur9h0reading symbolic information ...warning: no source compiled with -g
n8Dw.K/MEE)_+]^0
2C2wA5DvD8z1B0AIX专家俱乐部.zm`@'dV
IOT/Abort trap in raise at 0xd01f4f60
#S8Cb7vR+ov00xd01f4f60 (raise+0x40) 80410014 lwz r2,0x14(r1)
1k~'L1q7g0 |
AIX专家俱乐部~X9A#eai5~JD
AIX专家俱乐部CmLxj K?'C
列举源码信息
n(SJw%q0AIX专家俱乐部j,tX8J|7J
列举程序源码list需要在运行 dbx 命令时使用 -I 指明源码搜索路径并使用 -g 编译或者汇编码listiAIX专家俱乐部WKR/^L[
(dbx) listi mainAIX专家俱乐部e{w;a0t@jr
0x10001924 (main) 7c0802a6 mflr r0AIX专家俱乐部1v4]+mv0t;e0z
0x10001928 (main+0x4) bfa1fff4 stmw r29,-12(r1)AIX专家俱乐部Ptfef Y&_%~
0x1000192c (main+0x8) 90010008 stw r0,0x8(r1)
,l?0\'O[W00x10001930 (main+0xc) 9421ffa0 stwu r1,-96(r1)
%O0hcTw'n`(]00x10001934 (main+0x10) 83e20064 lwz r31,0x64(r2)
Zub)jG00x10001938 (main+0x14) 90610078 stw r3,0x78(r1)
m~W/~2`v2F\00x1000193c (main+0x18) 9081007c stw r4,0x7c(r1)AIX专家俱乐部?N\)K[9})L
0x10001940 (main+0x1c) 83a20068 lwz r29,0x68(r2)AIX专家俱乐部H)S;m)U6j%Xe-}
|
AIX专家俱乐部9H_nHN4@{$h9f;@ q
LGy!\^3cF0 列举变量内容
hiD_Y0
y5dPjhL%H0 示例代码AIX专家俱乐部)p}3mb|UW
#include <iostream>AIX专家俱乐部+w!k{o*]K
#include <signal.h>
%P-`.y5^8sW/K0int g_test =0;
!v9z&K b6G0AIX专家俱乐部'\(lE1h;Yl
int testfunc(int ¶)AIX专家俱乐部*V!{"Yq:p3O]
{
d0p?uy;]`?!}0 para++;
8r?;`/p3|0 return 0;
Fu(l$ih$TO7ns_0}
!th]r K8O9I0
D|8u)Kg3WYyjcw0int main(int argc, char* argv[])AIX专家俱乐部'twW aJ)|&bf3O
{
KJ:wx:w!Hz$h0 struct sigaction s;AIX专家俱乐部 iHt|7w^0@ s$kL
s.sa_handler = SIG_DFL;AIX专家俱乐部fFeR,sb._4^
s.sa_mask.losigs = 0;AIX专家俱乐部A*g/E$P KbJ!y
s.sa_mask.hisigs = 0;AIX专家俱乐部'Xr&}?]:A_
s.sa_flags = SA_FULLDUMP;
E0^X;PL"{*w S0 sigaction(SIGSEGV,&s,(struct sigaction *) NULL);
:};f-e(O]T0
1Y9zl"o'YK0 char str[10];AIX专家俱乐部N$r2Ei2m
g_test =0;AIX专家俱乐部$Q:Hu9LW:x9U
:YVc)A8}&q&a"M0 testfunc(g_test);AIX专家俱乐部a#K9P"F Zb}
abort();AIX专家俱乐部eV]ba7_O
}AIX专家俱乐部0L @ Rg'E-XYH
# xlC test.C -g
MXmg7VeWAG B0 |
8kCR(V\ C"w:x0
!dcY2U Ew t-s!]0 以全局变量 g_test 举例AIX专家俱乐部.nq"Z_g2\z.x
AIX专家俱乐部4vlgP2q/\`
#print g_test 显示 g_test 的取值
F2k(P'c1M,T0
,q.CQ)z!mp6Z0#print sizeof(g_test) 显示 g_test 的大小
.D(l!O^h3K0
spQ%bo(hN/[0#whatis g_test 显示 g_test 的类型
'C? ` A#wB0
w3xsU%EP0#print &g_test 显示 g_test 的地址 AIX专家俱乐部%do-c`tQx
AIX专家俱乐部y'TdrEc.vV,?
#&g_test/16x 显示从 g_test 的地址开始处连续 16 个 WORD?byte的取值
WI:X2L2rH^avd`0
$d2[P~-mK9F!o0 如果没有使用 -g 编译则不能动态获取 g_test 的类型、大小等信息但能够得到 g_test 的地址并查询该地址所在区域存储空间的值。
.Q?EIz0
&yd ^{$n4z,l0 例如
!mSN6A[0
# ./a.out
H+y7\ z*jKy"C%s0IOT/Abort trap(coredump)
,kKE!u1\(u0# dbx ./a.out core
].}`,G!Uv-O,]DM r0Type 'help' for help.
g.Ec+v-NA#V!gD4N0[using memory image in core]
:cUyXnqjk$Qg4G&d0reading symbolic information ...
o)R E qc#^6y'dw)Pb0AIX专家俱乐部y}C0i:w7[5? rHN!D
IOT/Abort trap in raise at 0xd03365bc
F-h6]b;`00xd03365bc (raise+0x40) 80410014 lwz r2,0x14(r1)AIX专家俱乐部1E4J1jl;Tc$oe
(dbx) print g_testAIX专家俱乐部j8\Ac|&k
1AIX专家俱乐部E+C[ WK;T;s
(dbx) whatis g_test
p0N5um3n#LG8mBD0int g_test;AIX专家俱乐部4h Nv;mI+o
(dbx) print sizeof(g_test)
M2q:O:y'z(Di04
Y*f-n@Y&q'\E/c0(dbx) print &g_test
6fj,a~9iY.A00x20000428AIX专家俱乐部,a}7pqvI}Ju-Cc
(dbx) &g_test/16xAIX专家俱乐部:B%RCqxS
0x20000428: 0000 0001 0000 0000 0000 0000 0000 0000
E%U4JtR8x8G7b9aB00x20000438: 0000 0000 0000 0000 0000 0000 0000 0000
%Gv&G n%yNW_#}0 |
5j`5|R$m8c[~0AIX专家俱乐部_4eN2zh^8|
列举寄存器内容
-i*O(o;ig's0
&tl2k;|gLY2HAS9P0 列举寄存器内容AIX专家俱乐部m yB7J!q5?H?'v4M
FHhdfiBn0(dbx) registers
m5F9{$l8W)h0
/KnTke2s0 如下模拟一个简单的 core dump对 0 地址赋值引发 core dump 的问题AIX专家俱乐部N vHfwjTI M"a
# dbx ./a.out coreAIX专家俱乐部:A2gI@P_1}
Type 'help' for help.
P ~_2c.c!Y+?0warning: The core file is not a fullcore. Some info may
;L[*Ns%IL8m)r0not be available.AIX专家俱乐部P-}U8K2_!yT
[using memory image in core]AIX专家俱乐部Npa4p-I
reading symbolic information ...warning: no source compiled with -g
5y#X2FF#T0
)mws{?%k4V.Ivg!h0
U&n7O;X{z&xt0Segmentation fault in main at 0x10000348AIX专家俱乐部!X6rOTC
0x10000348 (main+0x18) 90640000 stw r3,0x0(r4)
$KQ7mEp^0(dbx) whereAIX专家俱乐部{)kZ[w]
main(0x1, 0x2ff22ccc) at 0x10000348AIX专家俱乐部-{fs;n:?z/T
(dbx) registers
iS%c m/m#u0 $r0:0x00000000 $stkp:0x2ff22bf0 $toc:0x20000414 $r3:0x00000012AIX专家俱乐部,|%NdIW*K*c&C
$r4:0x00000000 $r5:0x2ff22cd4 $r6:0xdeadbeef $r7:0x2ff22ff8
Q4n(j!{k+w'G6f `0 $r8:0x00000000 $r9:0x04030000 $r10:0xf0577538 $r11:0xdeadbeefAIX专家俱乐部"\yhh:K#PVN
$r12:0xdeadbeef $r13:0xdeadbeef $r14:0x00000001 $r15:0x2ff22cccAIX专家俱乐部d'q7Li@#z:^+y
$r16:0x2ff22cd4 $r17:0x00000000 $r18:0xdeadbeef $r19:0xdeadbeefAIX专家俱乐部+P*c(B+o8o/jyA@
$r20:0xdeadbeef $r21:0xdeadbeef $r22:0xdeadbeef $r23:0xdeadbeefAIX专家俱乐部K]2Zi9Ja9QJ
$r24:0xdeadbeef $r25:0xdeadbeef $r26:0xdeadbeef $r27:0xdeadbeef
9qOn6X0@O0F0 $r28:0xdeadbeef $r29:0xdeadbeef $r30:0xdeadbeef $r31:0xdeadbeef
['v,z0_,kJg0 $iar:0x10000348 $msr:0x0000d0b2 $cr:0x22282489 $link:0x100001b4AIX专家俱乐部d!`K-n:nD*e2df$Y7D
$ctr:0xdeadbeef $xer:0x20000020
%h0~ W"S2v-o'd0 Condition status = 0:e 1:e 2:e 3:l 4:e 5:g 6:l 7:lo
(w2f8YY:Y}0 [unset $noflregs to view floating point registers]
y |;|C[-@C0 [unset $novregs to view vector registers]AIX专家俱乐部,N#~_p5h
in main at 0x10000348AIX专家俱乐部n:ycbA-LWY:V
0x10000348 (main+0x18) 90640000 stw r3,0x0(r4)
I-p?$?6B8T&vBkq)a$z0L0(dbx) print $r3AIX专家俱乐部#? dJ5xv1WXU[!NX
0x00000012AIX专家俱乐部 cFe#Qv)|F
(dbx) print $r4
Nll"c;X1D)j^0(nil)
,NpL)kMc;PW0 |
AIX专家俱乐部G iOD3s-A3h
tmsr\/m9^;j/C0 这个例子比较简单从最后汇编指令“stw r3,0x0(r4)”就可以简单的看到程序 core dump 是因为向 0 地址0+r4存入 18r3 寄存器值造成。AIX专家俱乐部6e0o!S8zh n*Pd
AIX专家俱乐部]$ja$J3uf4a[}
查看多线程相关信息
3u{hPZ9Xp3f0
qk?&nPg]![0 如果以下环境变量采用默认的 OFF 值则系统会完全禁止适当的调试列表这意味着 dbx 命令将显示不出任何对象
W#C:[hw[i\0AIX专家俱乐部!AV9AO^;l
AIXTHREAD_MUTEX_DEBUGAIX专家俱乐部-l)v N!d'[
3k3a%yx r5G0AIXTHREAD_COND_DEBUG
)V&cJd;^0AIX专家俱乐部b I;h0] x a!pu v
AIXTHREAD_RWLOCK_DEBUG
byit A4]z0AIX专家俱乐部(F\}F6Y\
可以使用
4t!m4D |6P@ KtbT0AIX专家俱乐部 |fv:W?Y1Pm#h
export AIXTHREAD_MUTEX_DEBUG=ON
L@]-r;f+n,v0
BFQ Ogg x@K0 打开 AIXTHREAD_MUTEX_DEBUG。AIX专家俱乐部$s.~A*DtZ
查看线程信息 AIX专家俱乐部2s ug.Xl.| Rr1q}
(dbx) print $t1 // 打印 t1 线程的基本信息
SA!YS`+~}#]2V1Z0 /}LJLhDHk+U0(dbx) attribute
I"s{7j%S(AU0 0P:Z+we5~%N9{0(dbx) condition
W6}ZZUb0AIX专家俱乐部(MVV)^e`]3n (dbx) mutex
V;M5m/hPX+eV#FO0AIX专家俱乐部Px DBH/W;X)I2]B (dbx) rwlockAIX专家俱乐部`[,vqG"wQQm
AIX专家俱乐部0ZX3C;HW%p(]5C2bh | (dbx) thread
lL I}{G#A(wo0 n"w:~xJ0 例如AIX专家俱乐部 AdU2x!Q{L
AIX专家俱乐部B+d#Tur*X,_%q (thread_id = 1, state_u = 4, priority = 60, policy = other, attributes = 0x20001078)
5^6W[v;u0
切换当前线程默认当前线程为收到 core 触发信号所在线程 AIX专家俱乐部$J[w^2oHqK
(dbx) thread current [tid]
0h8nIs|3fqOr(G0AIX专家俱乐部PQ)WDq;T$R 例如> 表明 core dump 时的当前线程
)^-H-|GaM*v-sh x0
(dbx)thread
J?-i.Z#[Z"F0 thread state-k wchan state-u k-tid mode held scope functionAIX专家俱乐部`3Ge}:s!l
$t1 wait 0x31bbb558 running 10321 k no pro _ptrgl
8[[[} PZ4FEUM0 $t2 wait 0x311fb958 running 6275 k no pro _ptrgl AIX专家俱乐部1lE4^0o-sU5l+|H
>$t3 run running 6985 k no pro _p_nsleep
8G|6w'b ]hj0 $t4 wait 0x31bbbb18 running 6571 k no pro _ptrgl AIX专家俱乐部&ODV5ch~\Q
$t5 wait 0x311fb9d8 running 7999 k no pro _ptrgl AIX专家俱乐部fh4?hwm!o)r
$t6 wait 0x31bf8f98 running 8257 k no pro _ptrgl AIX专家俱乐部-]T,G(v!@R'H%n*K
$t7 wait 0x311fba18 running 8515 k no pro _ptrgl
7ZR+X0_(F n PMq-r0 $t8 wait 0x311fb7d8 running 8773 k no pro _ptrgl AIX专家俱乐部Zp2_~me1lX v4v
$t9 wait 0x311fbb18 running 9031 k no pro _ptrgl
HSIKtIExA;VQ0 $t10 wait 0x311fb898 running 9547 k no pro _ptrgl
#\O5i@mH0 $t11 wait 0x311fb818 running 9805 k no pro _ptrgl
Ku5Hg+s,^N){0 $t12 wait 0x311fba58 running 10063 k no pro _ptrgl
]3{\oq4\0 $t13 wait 0x311fb8d8 running 10579 k no pro _ptrgl
E,\GC-Rd1`%A0(dbx) thread current 3
F.@3iq j^e0(dbx) where
;QR:?(wO6BX3I2um0_p_nsleep(??, ??) at 0xd005f740AIX专家俱乐部7s!FGl;_D6R&doE|
raise.nsleep(??, ??) at 0xd022de3cAIX专家俱乐部 fR\lYvN)]C
sleep(??) at 0xd0260344AIX专家俱乐部 T^2zm.J$Q
helper(??) at 0x100005ac
{+m8N'f p0(dbx) thread current 4
^U'PUT#p,NbH0warning: Thread is in kernel mode, not all registers can be accessed.
~n o2l"Z Y `0(dbx) where
5xN.vqis:G0ptrgl._ptrgl() at 0xd020e470
CKG"x8a2_(zuc+d0raise.nsleep(??, ??) at 0xd022de3cAIX专家俱乐部(DLk"@D
raise.nsleep(??, ??) at 0xd022de3cAIX专家俱乐部WL:M-Tl6_+Sx
sleep(??) at 0xd0260344
1phE U"Q.~S0helper(??) at 0x100005acAIX专家俱乐部5y9^do&akH
(dbx)
gKhw0N.Sj0 |
ifPoh0
AIX专家俱乐部5^L#Q!S)Q3XZsD'[
core dump 分析的局限性 AIX专家俱乐部;B ~*vti5?mk
AIX专家俱乐部5R6H.HI"KI
不要期待能依赖 core dump 分析解决所有的问题下面是一个简单的模拟缓冲区溢出的例子在这个例子中由于缓冲区溢出覆盖了调用栈信息从而完全丢失了定位依据AIX专家俱乐部nU'w#WNRF_S
root@/tmp#>xlC test.C -g -o test2AIX专家俱乐部d'Lb5a6Z;vu` zh2H
root@/tmp#>
j2lQB{ K'~5U0root@/tmp#>./testAIX专家俱乐部+h(O1@/cS1DUZ
input str!
+Z;mN-Ki3C9z)V0AIX专家俱乐部|I8q2[$A)|F.\-e.N!B
012345678901234567890123456789AIX专家俱乐部$i5l)v+P `{vD)`#}E
Segmentation fault(coredump)AIX专家俱乐部oU%LR)}
root@/tmp#>dbx ./test2 core
#O1sS1t6bAB0Type 'help' for help.
&Zl6I,j/JYy4e P0[using memory image in core]AIX专家俱乐部4h'I6|@i2[$B
reading symbolic information ...
v|?7Oj)^8Z0
SU:[U3?0Segmentation fault in test2. at 0x34353634
tHcs @t00x34353634 (???) warning: Unable to access address 0x34353634 from coreAIX专家俱乐部*`Z)K2D2Ajo$o
(dbx) where
&Hh(]/X:De/A.j2~(S0warning: Unable to access address 0x34353634 from core
U(Dc+{/^1u4Y+m0warning: Unable to access address 0x34353634 from core
A1E;P&C1x_0warning: Unable to access address 0x34353630 from coreAIX专家俱乐部3cF5fB"knnE&t
warning: Unable to access address 0x34353630 from core
hU)Y,Kb*K r0warning: Unable to access address 0x34353634 from core
[$e7W*C^%v'D9F0warning: Unable to access address 0x34353634 from coreAIX专家俱乐部.L&@O5K*m.z
warning: Unable to access address 0x34353630 from coreAIX专家俱乐部:G@k8Yn6IV
warning: Unable to access address 0x34353630 from coreAIX专家俱乐部D$sbO_!i c
warning: Unable to access address 0x34353634 from coreAIX专家俱乐部 @7[3EcG
warning: Unable to access address 0x36373841 from coreAIX专家俱乐部E Jc9] V?l
test2.() at 0x34353634
m-w#~U%S0m{#wIK0warning: Unable to access address 0x36373839 from coreAIX专家俱乐部)Kl#h*qG
warning: Unable to access address 0x36373839 from core
.@;b+b$dH\0(dbx)
D+Jtz-Auh0 |
"c8SSa!K8Lc/i0
D cpS'VAz9k ~q0
AIX专家俱乐部E-p6ffmOT6AU |
AIX专家俱乐部3JT#H9BDoV z%B(Ot LF]gB\N1v0 |
AIX专家俱乐部_%Cs?1m[5hN
4[QN%Z&Ho8o,{h0AIX专家俱乐部*Ol5R.Y$|3oBh|
系统 dump 分析 AIX专家俱乐部]!R'VG-Gg}
AIX专家俱乐部)Zs1EWaQ`
环境变量设置
v"`!P5uw2gpc9c|oT({0
B$Bn^y8E,no0 可以通过“sysdumpdev –l”查看系统当前的 dump 配置信息
xR&y^YI0
root@/#>sysdumpdev -lAIX专家俱乐部[h/M]G/uEx9S"US
primary /dev/hd6AIX专家俱乐部d q"?6U^ N
secondary /dev/sysdumpnullAIX专家俱乐部 br9X4X Q+F
copy directory /var/adm/rasAIX专家俱乐部jq*L(n.M)b/Fa
forced copy flag TRUE
|R*iF T+@,l0always allow dump FALSE
H}1Umq0dump compression ON
B9u};zi;Q0L(d1~0 |
AIX专家俱乐部(sp*p QES
AIX专家俱乐部u&gB3{e6hL
注意旧版本的 AIX “always allow dump”可能默认为关闭为方便系统 crash 时问题定位建议打开可使用命令 sysdumpdev –K 或者使用 smitty -> System Environments-> Change / Show Characteristics of System Dump 菜单设置。
?H;V5T}7jdx7r3H0
;dJ6R%s$cb3W0sysdumpdev –L 获得最近系统产生的 dump 的相关统计信息
W+q2J\/U4B/R0
#>sysdumpdev -L
AENZc"vw8Z @)j00453-039
z"L?\1Pu`0Device name: /dev/hd6AIX专家俱乐部v"@K$e;y3~G%\
Major device number: 10AIX专家俱乐部P$M4h%b2Z"tO
Minor device number: 2
\2WX5iT,^o0Size: 18885120 bytes
e&dxP&ZI$~i0Uncompressed Size: 113724523 bytesAIX专家俱乐部)S#?B1[2T]j3{)L)X
Date/Time: Sat Jul 21 14:20:22 BEIST 2007AIX专家俱乐部jpL&p'f
Dump status: 0
~f7o:Uj!}h@0dump completed successfullyAIX专家俱乐部+z)l#FqF4N0A?)F
Dump copy filename: /var/adm/ras/vmcore.2.Z
:C/L[MF v[A0 |
AIX专家俱乐部$l]u u}#ba-m)F2Tc%a
AIX专家俱乐部$|R:tY {X7|bm ]c
为保证系统出现 crash 时dump device 能够保存下 dump 信息需要合理的配置 dump device 的大小可以使用 sysdumpdev –e 估计系统 dump 需要的空间。一般推荐的 dump device 值大小为 sysdumpdev –e 估计值的 1.5 倍。AIX专家俱乐部4@S;JD0pQ
i}#W!jdo0 环境变量设置
GvyD O/Lc*g0
-}D N,n \'o*FFN0 本文档只提供一些基本的 dump 分析指令详细内容请参考“KDB kernel debugger and kdb command ”。AIX专家俱乐部af[6r&LR+K
,^#Xl.q]0 初步分析 AIX专家俱乐部)wy8_LF
AIX专家俱乐部`5br.}h7_-Zl
kdb 对 dump 文件分析需要借助于产生 dump 的内核文件 /unix一般 snap –ac 会对此文件进行收集。初步命令如下AIX专家俱乐部C%F,@4o"IZA)G
AIX专家俱乐部mx\n+^#\nz$B C
#kdb ./dump ./unixAIX专家俱乐部(N"p;}~ Q%RUY
AIX专家俱乐部&WP:].I7t1j i5P
示例
,f"HI#N!sWu0
#kdb ./dump ./unixAIX专家俱乐部2Vr+j|/i
The specified kernel file is a 64-bit kernelAIX专家俱乐部nr;jx{x
./dump mapped from @ 700000000000000 to @ 70000007da53bd5AIX专家俱乐部"Sa5@Wt
Preserving 1317350 bytes of symbol table
;Y5~C-I&|%o t%K q0First symbol __mulh
N;v8qBA,Jy(ir0Component Names:
i!A!FX%`[ nR0 1) minidump [2 entries]AIX专家俱乐部0iXD/j'mE.if
2) dmp_minimal [9 entries]AIX专家俱乐部.RG"Ofs3jce5BJ'd-G
3) proc [481 entries]AIX专家俱乐部QzK*x5e'A&@G\m
4) thrd [1539 entries]AIX专家俱乐部;T7F,L5E:R!~!h6g
5) rasct [1 entries]AIX专家俱乐部'[,}M!Z6N2@h*t
6) ldr [2 entries]
!TW5s/Z F"M.k0 7) errlg [3 entries]AIX专家俱乐部hI|d9zBz4J
8) mtrc [26 entries]AIX专家俱乐部1PUt7} iC!tS+G
9) lfs [1 entries]
m5dI)[/f g;s6e010) bos [2 entries]AIX专家俱乐部$h&|z0D7o_/n@2@ Y HH
11) ipc [7 entries]
id;uyu'lMh012) vmm [13 entries]
2^)jM.fq&z \'o013) alloc_kheap [256 entries]
/B/bzJx:|qpm%H014) alloc_other [26 entries]
y#\8jIG015) rtastrc [8 entries]AIX专家俱乐部*{ZG nK0jV
16) efcdd [20 entries]AIX专家俱乐部d*UcP|jxKU
17) eidedd [1 entries]
&FK j3Yy*{018) sisraid [2 entries]AIX专家俱乐部FB(hu+m)]#k4F
19) aixpcm [5 entries]
][8TGE)H8{020) scdisk [11 entries]AIX专家俱乐部 n2vqC/N
21) lvm [2 entries]
z?n;fIS%^022) jfs2 [1 entries]
M~:dRq Zt*e"L023) tty [4 entries]
`~A)Tj:|(X Z024) netstat [10 entries]
UbI8D6K%qHi025) goent_dd [7 entries]
)Z7HQB6^S026) scsidisk [11 entries]
ws5{J8g)WJV027) efscsi [5 entries]AIX专家俱乐部 Yn2_yBh
28) dump_statistics [1 entries]AIX专家俱乐部4\)DGuB
Component Dump Table has 2456 entries
-Q+NZ}| }8R(xv0 START END <name>
%y5ep7QJq[00000000000001000 0000000003BBA050 start+000FD8AIX专家俱乐部;Rq0aEf$@[6r
F00000002FF47600 F00000002FFDC920 __ublock+000000
vC&]COm3aw+l0000000002FF22FF4 000000002FF22FF8 environ+000000AIX专家俱乐部T ~G*P(_~X8s:d F"VQ
000000002FF22FF8 000000002FF22FFC errno+000000
7z+J0cEt$I@0F100070F00000000 F100070F10000000 pvproc+000000AIX专家俱乐部DS+t2j5\g
F100070F10000000 F100070F18000000 pvthread+000000AIX专家俱乐部eD*@-VKft4v.uif
PFT:AIX专家俱乐部7M1g*X/U-c
PVT:AIX专家俱乐部T7g3fS4kp
id....................0002
/CT.Yd\?F0raddr.....0000000000686000 eaddr.....F200800030000000
`*lH_i2K#eob`0size..............00040000 align.............00001000
S/|r#h$OS)J0valid..1 ros....0 fixlmb.1 seg....0 wimg...2AIX专家俱乐部"X Bp4e"g
Dump analysis on CHRP_SMP_PCI POWER_PC POWER_5 machine with 8 available CPU(s)
2^"Fb.b-N\3M0(64-bit registers)AIX专家俱乐部l8|.B)J/hh
Processing symbol table...AIX专家俱乐部Ih[&hbjY'}Q{:O4k
.......................done
#KRzn7B9^VI+h0 |
Z$HIN-xSG*U7H1Q0
1i+q5|$YM0 分析命令示例 AIX专家俱乐部 @k!v&q0db(r{"T3o
3q`h$}f0status 查看各个 CPU 在 dump 时正在运行的进程如AIX专家俱乐部.T].Kd!\(dS#QWr
0)> statusAIX专家俱乐部(hJ8Y?3v"^`s
CPU TID TSLOT PID PSLOT PROC_NAMEAIX专家俱乐部-b.e_ vd(E[+e~b(V
0 2580F5 600 14C0F6 332 cronAIX专家俱乐部*EXY,BCRn
1 12025 18 D01A 13 waitAIX专家俱乐部%b G U e+N
2 1020BB 258 1580C6 344 exprAIX专家俱乐部~"X X#?$]O~5|o1?6C
3 1502B 21 F01E 15 wait
J'N,TgX s*yj \#z0 |
V'`2l]^9Ns~#_4GY0
F!x?R-OzU3? hn0cpu <id> 命令切换当前 CPU默认的当前 CPU 为 cpu0AIX专家俱乐部&~G!E)zR}&C.]
AIX专家俱乐部 XCIID"ZW
(0)> cpu 1AIX专家俱乐部.{6t5vO B
AIX专家俱乐部sL'bFDV6m#U%P
(1)>AIX专家俱乐部rr3p*p$d3y!D
AIX专家俱乐部i3[$jr,WU:~`
打印系统的基本状态和相关信息
\3En/eaT0AIX专家俱乐部8LD+t'O1BY&]1C1s
(0)> statAIX专家俱乐部$OlV-k`4bm
AIX专家俱乐部\1Y~R6OU%x
打印系统 dump 时内核栈的情况AIX专家俱乐部O lYG%H,y4z7tD
AIX专家俱乐部!Ki5bg5q;PpB
(0)> fAIX专家俱乐部n(U"K5~M
_SFk,U*P&C0lke 用来列出内核代码对应的相关系统文件信息AIX专家俱乐部*Y"~._kc'c3~
AIX专家俱乐部 k*}f;@7r)dn$V
(0)> lke 003DE9CC
tT,~WY {\[0AIX专家俱乐部HL(wm#X}-V"JG
显示系统 dump 时最后所在的指令
][ wT1P#sB;jQ,J0
,wBx7[XR0(0)> dr iarAIX专家俱乐部6L1y)Z~|
AIX专家俱乐部$N0K$uv#P6`9]3vo:F8JE
显示虚拟存储管理的日志信息其中 Exception value 若为 0000001C 则表示 pagingspace 耗尽
|!o;qb_e0y%G0
uET1ZfhE;b-S H0(0)> vmlogAIX专家俱乐部HTQpw
{${0^oY4k0 显示进程表的信息AIX专家俱乐部pJbo8czJ
AIX专家俱乐部sX;w,\2]FvM)y3Qc
(0)> proc
(DKP ^0B!\;Z$F0
LSJ&lb-Ah0 显示线程表的信息AIX专家俱乐部_H _uV\o
AIX专家俱乐部J\"B'IHG`%Ip'o)a
(0)> th
'AN`JLD0
S-o*ox8iGT0 显示系统的 errpt 信息AIX专家俱乐部Abq2e?NoG*xq4O7Q
AIX专家俱乐部0Wt0Q&b }ck!E
(0)> errptAIX专家俱乐部G?)@:A~q.XK
ERRORS NOT READ BY ERRDEMON (ORDERED CHRONOLOGICALLY):
_AHK8C D$Z!F0
A3j*vO?b$qoM;O0Error Record:
TNR*I.u;TS0erec_flags .............. 1AIX专家俱乐部4e8d4?\pm#x
erec_len ................ 54AIX专家俱乐部iSDKoh,y
erec_timestamp .......... 46DCDD9DAIX专家俱乐部+y,k}U:I;I
erec_rec_len ............ 34
0Z9X7d*sX2rF7_(sS0erec_dupcount ........... 0AIX专家俱乐部7J6{TY$[xa
erec_duptime1 ........... 0AIX专家俱乐部 c'E2p?8Zk'[Q7Q6~0g~Y
erec_duptime2 ........... 0
{#aLhSW9J$O+f0erec_rec.error_id ....... DD11B4AFAIX专家俱乐部.M\@y:Qw
erec_rec.resource_name .. SYSPROCAIX专家俱乐部y-z(]X1BZ
00007FFF FFFFD000 00000000 003DE9CC .............=..
,[]l7Gw!x000000000 00020000 80000000 000290B2 ................
本文转自 xkdcc 51CTO博客,原文链接:http://blog.51cto.com/brantc/386824,如需转载请自行联系原作者