Eric Schrock wrote:
> You have a couple different things in play here.
>
> First, MDB pipelines only work with uintptr_t's, not arbitrary text.  So
> when you try to pipe something like "foo: X" or "X Y Z" to another dcmd,
> the parser will choke.
>
> Normally, the formatting commands ('/' and friends) recognize when you
> are in pipe context and omit any extraneous formatting characters.
> Since they only output numbers, they are safe to use in pipe context.
>
> However, under ::eval, any notion of pipe context is (intentionally)
> ignored.  So ::eval '/Kn' will print the extra formatting characters
> (such as "swap_vnodes:") as it has no way of knowing it's being used in
> pipe context outside the eval context.  One way to get around this is to
> do something like:
>
>       ::array ... p | ::eval '<p/Kn | =Kn' | ::grep .==0
>   
Hi Eric, 

I really appreciate your kindness to explain this for me. 

::array ... p | ::eval '<p/Kn | =Kn' gives pure uintptr_t's  so it works well 
with mdb pipeline. What I am suprized is that ::array ... p | /Kn *doesn't* 
give pure uintptr_t's, as its output has an address in the first line, so I 
expect it will break the mdb pipeline, but instead it works. Am I missing 
anything here?

Many thanks,
Zhijun

------------------------------------------------
[The output of /Kn and ::eval '<p/Kn | =Kn']


 > fffffffecb5bc000::array "struct vnode *" 10 p |/Kn
*0xfffffffecb5bc000:             0   // I think this will break the 
pipeline, but it doesn't *
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0

 > fffffffecb5bc000::array "struct vnode *" 10 p | ::eval '<p/Kn | =Kn'
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0
                0


> That being said, for this particular case you do not need the '::eval
> <p' at all, since it's identical to the output from '::array'.
>
> - Eric
>
> On Fri, Aug 24, 2007 at 11:29:01PM +0800, zhijun wrote:
>   
>> 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
>>
>>
>>
>>
>> _______________________________________________
>> mdb-discuss mailing list
>> mdb-discuss at opensolaris.org
>>     
>
> --
> Eric Schrock, Solaris Kernel Development       http://blogs.sun.com/eschrock
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.opensolaris.org/pipermail/mdb-discuss/attachments/20070825/ee851c34/attachment.html>

Reply via email to