HACK#39 如何调试客户端操作系统

本节介绍客户端操作系统的调试方法。

客户端操作系统的调试关系到很多组件,因此经常会困惑应该从哪里下手?例如,当客户端操作系统的驱动程序出现异常时,很多情况下都难以分辨是设备驱动程序有问题?还是设备仿真器有问题?还是主机操作系统的驱动程序有问题?当客户端操作系统意外停机(hang up)时,有时也不知道应当从哪里检查。

这里就介绍可以用于客户端操作系统调试的一些技巧。

Xen的情况

首先,进行调试时需要确认日志(见表5-8)和客户端操作系统的状态。确认客户端操作系统的状态时可以使用xm list或virsh list命令。

HACK#39 如何调试客户端操作系统 - 图1

表5-8 Xen的日志文件

HACK#39 如何调试客户端操作系统 - 图2

HACK#39 如何调试客户端操作系统 - 图3

使用xenctx命令,就可以简单方便地确认客户端操作系统是否意外停机。xenctx命令是显示指定客户端操作系统的虚拟CPU上下文信息的命令。从主机操作系统观察rip寄存器的值或栈的内容是否发生变化,就可以确认客户端操作系统是否意外停机。xenctx[选项]<domid><虚拟CPU编号>

例5-9 半虚拟化客户端操作系统的情况


/usr/lib64/xen/bin/xenctx 5 0

rip:ffffffff802063aa

rsp:ffffffff8063bf58

rax:00000000 rbx:00000000 rcx:ffffffff802063aa rdx:00000001

rsi:00000000 rdi:00000001 rbp:00000000

r8:00000081 r9:1001d5381 r10:ffff88001fd3a3e0 r11:00000246

r12:00000000 r13:00000000 r14:00000000 r15:00000000

cs:0000e033 ds:00000000 fs:00000000 gs:00000000

Stack:

0000000231002060 0000000000000000 ffffffff8026f4d5 0000000000000000

0000000000000000 0000000007020800 ffffffff8026ca50 0000000000000000

ffffffff8024afa1 0000000007020800 ffffffff80644b05 0000000000000000

0000000000000000 ffffffff80683d20 ffffffff806441e5 ffff800000000000

Code:

cc cc cc cc cc cc cc cc cc cc cc 51 41 53 b8 1d 00 00 00 0f 05<41>5b 59 c3

cc cc cc cc cc cc cc

Call Trace:

[<ffffffff802063aa>]<—

[<ffffffff8026f4d5>]

[<ffffffff8026ca50>]

[<ffffffff8024afa1>]

[<ffffffff80644b05>]

[<ffffffff80683d20>]

[<ffffffff806441e5>]


例5-10 全虚拟化客户端操作系统的情况


/usr/lib64/xen/bin/xenctx 12 0

rip:ffffffff8006b319

rsp:ffffffff803f3f90

rax:00000000 rbx:ffffffff8006b2f0 rcx:00000000 rdx:00000000

rsi:00000001 rdi:ffffffff80303698 rbp:00090000

r8:ffffffff803f2000 r9:0000003f r10:ffff81003ffa0008 r11:00000286

r12:00000000 r13:00000000 r14:00000000 r15:00000000

cs:00000010 ds:00000000 fs:00000000 gs:00000000

Stack:

ffffffff8004959b 0000000007000800 ffffffff803fd7fd 0000000000090000

0000000000000000 ffffffff80448740 ffffffff803fd22f 80008e000010019c

00000000ffffffff 0000000000000000 0000000000000000 0000000000200000

0000000000000000 0000000000000000

Code:

page entry not present in PT

page entry not present in PT

……snip……

page entry not present in PT

page entry not present in PT

53 ff 00 f0 53 ff 00 f0 53 ff 00 f0 53 ff 00 f0 53 ff 00 f0 53<ff>00 f0 53

ff 00 f0 53 ff 00 f0

Call Trace:

[<ffffffff8006b319>]<—

[<ffffffff8004959b>]

[<ffffffff803fd7fd>]

[<ffffffff80448740>]

[<ffffffff803fd22f>]


不停止客户端操作系统,提取客户端操作系统的内存转储时,使用xm dump-core命令(见表5-9)。


xm dump-core[-L|—live][-C|—crash]<Domain>[Filename]


HACK#39 如何调试客户端操作系统 - 图4


xm dump-core rhel5hvm/tmp/hoge

Dumping core of domain:rhel5hvm……


不指定文件名时,将在/var/lib/xen/dump下生成转储文件。也有一些发布版是在/var/xen/dump下生成转储文件。

转储文件通过使用crash命令来参照。然后,就可以与普通的crash命令一样进行调试。


crash/usr/lib/debug/lib/modules/2.6.18-164.el5xen/vmlinux/tmp/hoge

crash 4.0-8.9.1.el5

Copyright(C)2002,2003,2004,2005,2006,2007,2008,2009 Red Hat, Inc.

Copyright(C)2004,2005,2006 IBM Corporation

Copyright(C)1999-2006 Hewlett-Packard Co

Copyright(C)2005,2006 Fujitsu Limited

Copyright(C)2006,2007 VA Linux Systems Japan K.K.

Copyright(C)2005 NEC Corporation

There is absolutely no warranty for GDB.Type"show warranty"for details.


HACK#39 如何调试客户端操作系统 - 图5