>>>> fffffffecc47e000::array "struct vnode *" 0t2048 p|::eval <p/K
>>>> 0xfffffffecc47e000: 0
>>>> 0xfffffffecc47e008: 0
>>>> 0xfffffffecc47e010: 0
>>>> 0xfffffffecc47e018: 0
>>>> 0xfffffffecc47e020: 0
>>>> 0xfffffffecc47e028: 0
>>>> 0xfffffffecc47e030: 0
>>>> 0xfffffffecc47e038: 0
>>>> 0xfffffffecc47e040: 0
>>>> 0xfffffffecc47e048: 0
>>>> 0xfffffffecc47e050: 0
>>>> 0xfffffffecc47e058: 0
>>>> 0xfffffffecc47e060: 0
>>>> 0xfffffffecc47e068: 0
>>>> 0xfffffffecc47e070: 0
>>>> ......
>>>>
>>>>> fffffffecc47e000::array "struct vnode *" 0t2048 p|::eval 
>>>>> <p/K|::grep .!=0
>>>> sh: =0: not found
>>>> mdb: syntax error on line 1 of (pipeline) near ":"
>>>>> fffffffecc47e000::array "struct vnode *" 0t2048 p|::eval 
>>>>> <p/K|::grep .==0
>>>> mdb: syntax error on line 1 of (pipeline) near ":"
>>>>
>>>>> 0xfffffffecc47e000/K|::grep .!=0
>>>> sh: =0: not found
>>>>> 0xfffffffecc47e000/K|::grep .==0
>>>> 0
>>>>
>>>> My two questions:
>>>> 1) It seems that != is not supported in mdb, so how can I specify "not
>>>> equal" in mdb?
>>>> 2) While == works, it doesn't work for the above case, I guess it is
>>>> related to "/K", is there any way to work around it or do we need 
>>>> to fix it?
>>>>
>>>> Thanks,
>>>> Zhijun
While I still have some doublt for my second question, in which,
fffffffecc47e000::array "struct vnode *" 0t2048 p|::eval <p/K|::grep 
.==0   doesn't work.

 > swap_vnodes/K
swap_vnodes:
swap_vnodes:    fffffffecb5bc000

 > fffffffecb5bc000::array "struct vnode *" 10  
fffffffecb5bc000
fffffffecb5bc008
fffffffecb5bc010
fffffffecb5bc018
fffffffecb5bc020
fffffffecb5bc028
fffffffecb5bc030
fffffffecb5bc038
fffffffecb5bc040
fffffffecb5bc048
fffffffecb5bc050
fffffffecb5bc058
fffffffecb5bc060
fffffffecb5bc068
fffffffecb5bc070
fffffffecb5bc078

Use ::grep pipelined with ::eval<p=K can work while with ::eval <p/K 
doesn't work

 > fffffffecb5bc000::array "struct vnode *" 10 p|::eval <p=K|::grep 
.==0   /* this works */
 > fffffffecb5bc000::array "struct vnode *" 10 p|::eval <p/K|::grep 
.==0    /* this doesn't work */
mdb: syntax error on line 1 of (pipeline) near ":"

 > fffffffecb5bc000::array "struct vnode *" 10 p|::eval <p=K
                fffffffecb5bc000
                fffffffecb5bc008
                fffffffecb5bc010
                fffffffecb5bc018
                fffffffecb5bc020
                fffffffecb5bc028
                fffffffecb5bc030
                fffffffecb5bc038
                fffffffecb5bc040
                fffffffecb5bc048
                fffffffecb5bc050
                fffffffecb5bc058
                fffffffecb5bc060
                fffffffecb5bc068
                fffffffecb5bc070
                fffffffecb5bc078
 > fffffffecb5bc000::array "struct vnode *" 10 p|::eval <p/K
0xfffffffecb5bc000:             0
0xfffffffecb5bc008:             0
0xfffffffecb5bc010:             0
0xfffffffecb5bc018:             0
0xfffffffecb5bc020:             0
0xfffffffecb5bc028:             0
0xfffffffecb5bc030:             0
0xfffffffecb5bc038:             0
0xfffffffecb5bc040:             0
0xfffffffecb5bc048:             0
0xfffffffecb5bc050:             0
0xfffffffecb5bc058:             0
0xfffffffecb5bc060:             0
0xfffffffecb5bc068:             0
0xfffffffecb5bc070:             0
0xfffffffecb5bc078:             0

Looking at the above output, I guess the reason is the output format, I 
checked "Solaris Modular Debugger Guide" and on page 32 it says each 
line in the output before '|' must consist of an arithmetic expression 
terminated by a NEWLINE or semicolon. So it seems that the reason here 
is that the output of ::eval <p=K doesn't conform to this thus breaks 
the pipeline of dcmds. But let's look at the output of /Kn

 > fffffffecb5bc000::array "struct vnode *" 10 |/Kn
0xfffffffecb5bc000:             0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
 > fffffffecb5bc000::array "struct vnode *" 10 |/Kn|::grep .==0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

My two questions here:
While /n is added to make sure each expression occupies one line, here 
the first line does not exactly consist of an arithmetic expression, and 
it contains the address of the first entry in array, so I would expect 
it will break the pineline, but instead, it works fine. I am somehow 
puzzled about this. Could you give me some hint on this?
Another question is why the output of /Kn and ::eval <p/K are different? 
Basically I think the output should be the same as they each takes an 
address and dump the content one line a time.

Thanks again,
Zhijun





Reply via email to