首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

AIX 下的 core dump 分析入门-2

AIX 下的 core dump 分析入门-2

使用 dbx 分析 core dump 的例子 dbx 是 AIX 下基于命令行界面的源码级调试工具。本文档只提供一些基本的 dbx 分析指令,详细内容请参考“General Programming Concepts: Writing and Debugging Programs”关于 dbx 的描述。
初步分析
1
#dbx <program name> core




示例:
1
2
3
4
5
6
7
8
9
# dbx ./test core
Type 'help' for help.
warning: The core file is not a fullcore. Some info may
not be available.
[using memory image in core]
reading symbolic information ...warning: no source compiled with -g

Segmentation fault in raise at 0xd022e1e4
0xd022e1e4 (raise+0x40) 80410014 lwz r2,0x14(r1)




显示出 core 发生时,当前进程执行到的位置(-g 编译的情况下能够看到具体的行):
1
2
3
(dbx) where
raise(??) at 0xd022e1e4
main(0x1, 0x2ff22d48) at 0x100019c4




注意:
如果分析的是异地 core 文件,需要采用 snapcore 收集相关 core 信息。对于依赖链接库的情况,注意需要增加 -p oldpath=newpath:... 重新设置链接库路径(只有所有依赖的库都已经被链接,才能完整的复现 coredump 故障现场),参考 dbx 的帮助文档获取更多信息。
1
2
3
4
5
6
7
8
9
# cd /tmp/snapcore
# dbx –p /=./ a.out core
Type 'help' for help.
[using memory image in core]
reading symbolic information ...warning: no source compiled with -g


IOT/Abort trap in raise at 0xd01f4f60
0xd01f4f60 (raise+0x40) 80410014 lwz r2,0x14(r1)




列举源码信息
列举程序源码(list,需要在运行 dbx 命令时使用 -I 指明源码搜索路径,并使用 -g 编译)或者汇编码(listi):
1
2
3
4
5
6
7
8
9
(dbx) listi main
0x10001924 (main) 7c0802a6 mflr r0
0x10001928 (main+0x4) bfa1fff4 stmw r29,-12(r1)
0x1000192c (main+0x8) 90010008 stw r0,0x8(r1)
0x10001930 (main+0xc) 9421ffa0 stwu r1,-96(r1)
0x10001934 (main+0x10) 83e20064 lwz r31,0x64(r2)
0x10001938 (main+0x14) 90610078 stw r3,0x78(r1)
0x1000193c (main+0x18) 9081007c stw r4,0x7c(r1)
0x10001940 (main+0x1c) 83a20068 lwz r29,0x68(r2)




列举变量内容
示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <signal.h>
int g_test =0;

int testfunc(int &para)
{
para++;
return 0;
}

int main(int argc, char* argv[])
{
struct sigaction s;
s.sa_handler = SIG_DFL;
s.sa_mask.losigs = 0;
s.sa_mask.hisigs = 0;
s.sa_flags = SA_FULLDUMP;
sigaction(SIGSEGV,&s,(struct sigaction *) NULL);

char str[10];
g_test =0;

testfunc(g_test);
abort();
}
# xlC test.C -g




以全局变量 g_test 举例:
#print g_test 显示 g_test 的取值
#print sizeof(g_test) 显示 g_test 的大小
#whatis g_test 显示 g_test 的类型
#print &g_test 显示 g_test 的地址
#&g_test/16x 显示从 g_test 的地址开始处,连续 16 个 WORD(?byte)的取值
如果没有使用 -g 编译,则不能动态获取 g_test 的类型、大小等信息,但能够得到 g_test 的地址,并查询该地址所在区域存储空间的值。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# ./a.out
IOT/Abort trap(coredump)
# dbx ./a.out core
Type 'help' for help.
[using memory image in core]
reading symbolic information ...

IOT/Abort trap in raise at 0xd03365bc
0xd03365bc (raise+0x40) 80410014 lwz r2,0x14(r1)
(dbx) print g_test
1
(dbx) whatis g_test
int g_test;
(dbx) print sizeof(g_test)
4
(dbx) print &g_test
0x20000428
(dbx) &g_test/16x
0x20000428: 0000 0001 0000 0000 0000 0000 0000 0000
0x20000438: 0000 0000 0000 0000 0000 0000 0000 0000




列举寄存器内容
列举寄存器内容:
(dbx) registers
如下模拟一个简单的 core dump,对 0 地址赋值引发 core dump 的问题:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# dbx ./a.out core
Type 'help' for help.
warning: The core file is not a fullcore. Some info may
not be available.
[using memory image in core]
reading symbolic information ...warning: no source compiled with -g


Segmentation fault in main at 0x10000348
0x10000348 (main+0x18) 90640000 stw r3,0x0(r4)
(dbx) where
main(0x1, 0x2ff22ccc) at 0x10000348
(dbx) registers
$r0:0x00000000 $stkp:0x2ff22bf0 $toc:0x20000414 $r3:0x00000012
$r4:0x00000000 $r5:0x2ff22cd4 $r6:0xdeadbeef $r7:0x2ff22ff8
$r8:0x00000000 $r9:0x04030000 $r10:0xf0577538 $r11:0xdeadbeef
$r12:0xdeadbeef $r13:0xdeadbeef $r14:0x00000001 $r15:0x2ff22ccc
$r16:0x2ff22cd4 $r17:0x00000000 $r18:0xdeadbeef $r19:0xdeadbeef
$r20:0xdeadbeef $r21:0xdeadbeef $r22:0xdeadbeef $r23:0xdeadbeef
$r24:0xdeadbeef $r25:0xdeadbeef $r26:0xdeadbeef $r27:0xdeadbeef
$r28:0xdeadbeef $r29:0xdeadbeef $r30:0xdeadbeef $r31:0xdeadbeef
$iar:0x10000348 $msr:0x0000d0b2 $cr:0x22282489 $link:0x100001b4
$ctr:0xdeadbeef $xer:0x20000020
Condition status = 0:e 1:e 2:e 3:l 4:e 5:g 6:l 7:lo
[unset $noflregs to view floating point registers]
[unset $novregs to view vector registers]
in main at 0x10000348
0x10000348 (main+0x18) 90640000 stw r3,0x0(r4)
(dbx) print $r3
0x00000012
(dbx) print $r4
(nil)




这个例子比较简单,从最后汇编指令“stw r3,0x0(r4)”就可以简单的看到程序 core dump 是因为向 0 地址(0+r4)存入 18(r3 寄存器值)造成。
返回列表