星期六 九月 29, 2007
MDB调试STREAMS
Solaris的MDB是一个功能强大的调试工具,可以debug正在运行的核心/应用程序或者crash dump。本文简单介绍如何用mdb调试streams。
STREAMS的实现
首先,来看一下STREAMS在Solaris中是如何定义的,我们只列出感兴趣的部分。
usr/src/uts/common/sys/strsubr.h |
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的详细解释。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
> 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。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
> ::queue -m bge | ::queue
ADDR MODULE FLAGS NBLK
d340e718 bge 10204032 0 00000000
d36112e8 bge 10204032 0 00000000
大家可能早注意到了,这里列出的只是read queue地址,要想得到write queue的地址,用dcmd ::q2wrq即可。ADDR MODULE FLAGS NBLK
d340e718 bge 10204032 0 00000000
d36112e8 bge 10204032 0 00000000
> 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的关系,看一下它们的定义就一目了然了。ADDR MODULE FLAGS NBLK
d340e798 bge 244062 0 00000000
usr/src/uts/common/sys/strsubr.h |
在了解了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 | 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 |
+-----------------------+-----------------------+
> 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。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
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选项列出系统中所有特定类型的messageADDR 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
> ::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。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
> 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。ADDR FL TYPE LEN BLEN RPTR DBLK
e5023380 0 proto 24 64 deb4ca80 deb4ca40
d31b4940 0 data 98 320 d340ba27 d340b9c0
> 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如下。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
> 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
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:
Search This Site
Recent Entries
- Wake On LAN及其在Solaris中的实现
- Solaris如何配置SpeedStep
- Solaris 3D桌面:Compiz Fusion
- Solaris无线局域网系统架构
- MDB调试STREAMS
- STREAMS流控机制的实现
- 有用的DTrace资源
- 什么是802.11n
- 什么是ZigBee
- SUN服务器获InfoWorld 2007最佳技术奖
- 用dtrace脚本监测进程网络状态
- 在Solaris上Mount NTFS / FAT32 / FAT16 / EXT2 / EXT3文件系统
- 在Solaris上运行Windows
- Solaris又添一Marvell Libertas 8335/8310 802.11b/g无线网卡驱动
- 推荐一个小工具SPC(Solaris Package Companion)
- OpenSolaris和Ubuntu双系统安装
- Solariss无线局域网(WLAN)
- 在MacBook Pro上安装Solaris
- 在Solaris上用cdrecord刻录CD/DVD
- Solaris如何在64位平台上加载32位核心
Photos
| www.flickr.com |
Referrers & Other Stats
View My Stats