20070929 星期六 九月 29, 2007

MDB调试STREAMS Solaris的MDB是一个功能强大的调试工具,可以debug正在运行的核心/应用程序或者crash dump。本文简单介绍如何用mdb调试streams。

STREAMS的实现

首先,来看一下STREAMS在Solaris中是如何定义的,我们只列出感兴趣的部分。

然后分别看如何用MDB观察queue,message和streams。

QUEUE

MDB中相关的dcmd是::queue,在MDB中键入::help queue可以打印相关的帮助信息。如果输入不带参数的::queue将列出系统中所有的queue。

> ::queue
    ADDR MODULE         FLAGS NBLK
d302f008 usbkbm        002032    0 00000000
d302f170 hid           201032    0 00000000
d302f2d8 conskbd       24c032    0 00000000
d302f440 consms        202032    0 00000000
d302f5a8 strrhead      044032    0 00000000
d302f710 tcp           20204032  0 00000000

这里列出的实际上是所有的read queue,输出内容包括module名称、flags、queue中message的数目和指向queue中第一个消息的指针。如果指定queue的地址,:: queue将简单打印queue信息。加上“-v”选项,则会打印出flags的详细解释。

> d302f008::queue -v
    ADDR MODULE         FLAGS NBLK
d302f008 usbkbm        002032    0 00000000
                       |
                       +-->  QWANTR       Someone wants to read Q
                             QREADR       This is the reader (first) Q
                             QUSE         This queue in use (allocation)
                             QPERMOD      per module syncq

-m-f-F选项可用来缩小要答应的queue的范围。如打印所有属于网卡bge的queue。

> ::queue -m bge | ::queue
    ADDR MODULE         FLAGS NBLK
d340e718 bge           10204032    0 00000000
d36112e8 bge           10204032    0 00000000

大家可能早注意到了,这里列出的只是read queue地址,要想得到write queue的地址,用dcmd ::q2wrq即可。

> d340e718::q2wrq | ::queue
    ADDR MODULE         FLAGS NBLK
d340e798 bge           244062    0 00000000

Dcmd ::q2wrq用于获得和某个queue对应的write queue的地址,与之对应的是::q2rdq,用于获得和某个queue相对应的read queue的地址。无论是read queue还是write queue,都可以用::q2otherq获得对应的另一个queue的地址。至于read queue和write queue的关系,看一下它们的定义就一目了然了。

STREAMS

在了解了queue之后,你可能想知道queue所在的stream是什么样的。Dcmd  ::q2stream可以获得与queue对应的stream head的地址,而::stream则可以打印出图形化的stream结构。

> d340e718::q2stream | ::stream
+-----------------------+-----------------------+
| 0xd340e630            | 0xd340e5b0            |
| ip                    | ip                    |
|                       |                       |
| cnt = 0t0             | cnt = 0t0             |
| flg = 0x00204022      | flg = 0x00244032      |
+-----------------------+-----------------------+
            |                       ^
            v                       |
+-----------------------+-----------------------+
| 0xd3611a70            | 0xd36119f0            |
| arp                   | arp                   |
|                       |                       |
| cnt = 0t0             | cnt = 0t0             |
| flg = 0x00002022      | flg = 0x00002032      |
+-----------------------+-----------------------+
            |                       ^
            v                       |
+-----------------------+-----------------------+
| 0xd3611bd8            | 0xd3611b58            |
| ip                    | ip                    |
|                       |                       |
| cnt = 0t0             | cnt = 0t0             |
| flg = 0x00004022      | flg = 0x00004032      |
+-----------------------+-----------------------+
            |                       ^
            v                       |
+-----------------------+-----------------------+
| 0xd340e798            | 0xd340e718            |
| bge                   | bge                   |
|                       |                       |
| cnt = 0t0             | cnt = 0t0             |
| flg = 0x00244062      | flg = 0x10204032      |
+-----------------------+-----------------------+

在输出中可以看到stream中read queue、write queue的地址、数据量和状态。用::walk qnext可以得到相同的输出。

> 0xd340e630::walk qnext | ::queue
    ADDR MODULE         FLAGS NBLK
d340e630 ip            204022    0 00000000
d3611a70 arp           002022    0 00000000
d3611bd8 ip            004022    0 00000000
d340e798 bge           244062    0 00000000
> 0xd340e718::walk qnext | ::queue
    ADDR MODULE         FLAGS NBLK
d340e718 bge           10204032    0 00000000
d3611b58 ip            004032    0 00000000
d36119f0 arp           002032    0 00000000
d340e5b0 ip            244032    0 00000000

需要注意的是,::stream打印的是queue中的字节数,::queue则打印的是message数。下面我们就来看看quque中的message。

MESSAGE

同样,dcmd ::help mblk打印帮助信息。::mblk列出系统中所有的消息,加上-G选项列出系统中所有内容大于或等于指定长度的message。

> ::mblk -G 1 | ::mblk
    ADDR FL TYPE    LEN   BLEN      RPTR     DBLK
e5023000 0  pcsig   82    128   d5513b94 d5513b40
e5023040 0  data    44    64    d5fb7740 d5fb7700
e5023060 0  data    1460  1984  e1bdf8ac e1bdf800
e5023080 0  pcsig   82    128   de930dd4 de930d80
e5023360 0  data    21    64    d5fb78c4 d5fb7880
e5023380 0  proto   24    64    deb4ca80 deb4ca40
e50233a0 0  data    1300  1984  e1bdb94c e1bdb800

或者加上-t选项列出系统中所有特定类型的message

> ::mblk -t M_PROTO | ::mblk
    ADDR FL TYPE    LEN   BLEN      RPTR     DBLK
e5023380 0  proto   24    64    deb4ca80 deb4ca40
e5023420 0  proto   28    64    d5f5d2c0 d5f5d280
e5023520 0  proto   68    128   d4f49c40 d4f49c00
e5023740 0  proto   68    128   d72ac100 d72ac0c0
e50239c0 0  proto   0     64    d5f60540 d5f60500

我们知道,一个复杂的message可以由多个链接在一起的message组成,用::walk b_cont来遍历这样的复杂message。

> e5023380::walk b_cont | ::mblk
    ADDR FL TYPE    LEN   BLEN      RPTR     DBLK
e5023380 0  proto   24    64    deb4ca80 deb4ca40
d31b4940 0  data    98    320   d340ba27 d340b9c0

一个queue中的message通过b_next链接在一起,用::walk b_next来遍历所有用b_next链接在一起的message。

> e5023380::walk b_next | ::mblk
    ADDR FL TYPE    LEN   BLEN      RPTR     DBLK
e5023380 0  proto   24    64    deb4ca80 deb4ca40
d5f63040 0  proto   24    64    dbb51700 dbb516c0
d4fe4f80 0  proto   24    64    deb4e400 deb4e3c0
d773b860 0  proto   24    64    d591f780 d591f740

或者组合使用::walk b_cont::walk b_next如下。

> e5023380::walk b_next | ::walk b_cont | ::mblk
    ADDR FL TYPE    LEN   BLEN      RPTR     DBLK
e5023380 0  proto   24    64    deb4ca80 deb4ca40
d31b4940 0  data    98    320   d340ba27 d340b9c0
d5f63040 0  proto   24    64    dbb51700 dbb516c0
d4032880 0  data    60    320   d33f9deb d33f9d80
d4fe4f80 0  proto   24    64    deb4e400 deb4e3c0
d773be20 0  data    57    320   d301506b d3015000
d773b860 0  proto   24    64    d591f780 d591f740
e03f51c0 0  data    60    320   d4095aeb d4095a80



Posted by Judy Chen in STREAMS at 20070929 Comments[0]

Comments:

Post a Comment:
Comments are closed for this entry.
Click me to subscribe
Judy Chen
« 十二月 2008
星期日星期一星期二星期三星期四星期五星期六
 
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
   
       
Today

Recent Entries



Photos

www.flickr.com


Referrers & Other Stats


View My Stats