Systemtap%M printf格式只返回一个字符

时间:2014-01-09 14:35:59

标签: sockets printf systemtap

我正在尝试打印套接字上收到的数据 - 在sys_recv返回时的ubuf内容。我不能让%M格式说明符正常工作。有人可以解释如何正确使用它。感谢

stap -L 'kernel.function("sys_recv@net/socket.c")'
kernel.function("sys_recv@net/socket.c:1800") $fd:int $ubuf:void* $size:size_t $flags:unsigned int

使用此探针: [laris @ kakitis stap] $ cat socket-recv.stp

#! /usr/bin/env stap
probe kernel.function("sys_recv@net/socket.c").return {
        if (pid() == target())
                printf ("%s  fd %d size %d  ubuf %p %10M \n ", ppfunc(),$fd,$size,$ubuf,$ubuf)
}

从我对手册页的阅读中,格式%10M应该从$ ubuf指向的位置返回10个字节:void但我只得到1.调整参数10会移动一个字符输出而不是显示更多或更少的内存

[root@kakitis stap]# stap -x 16796 socket-recv.stp 
sys_recv  fd 13 size 64071  ubuf 0x86ceca0         70 
 sys_recv  fd 13 size 62679  ubuf 0x86cf210         50 

将10更改为2会产生此

[root@kakitis stap]# stap -x 16796 socket-recv.stp 
sys_recv  fd 13 size 64071  ubuf 0x86ceca0 70 
 sys_recv  fd 13 size 62679  ubuf 0x86cf210 50

系统详情如下:

[laris@kakitis stap]$ stap --version
Systemtap translator/driver (version 2.1/0.154, rpm 2.1-2.fc17)
Copyright (C) 2005-2013 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
enabled features: AVAHI LIBRPM LIBSQLITE3 NSS TR1_UNORDERED_MAP NLS
[laris@kakitis stap]$ uname -a
Linux kakitis 3.4.33 #1 SMP Tue Jan 7 14:15:58 EST 2014 i686 i686 i386 GNU/Linux
[laris@kakitis stap]$ cat /etc/redhat-release 
Fedora release 17 (Beefy Miracle)

1 个答案:

答案 0 :(得分:1)

不要混淆printf()的输出宽度和精度参数。以下将完成你的意思:

printf ("%33.10M", $pointer)

在33个字符宽的输出字段中打印10个字节(20个十六进制字符)。一个或两个数字可以用*替换,以便相应的宽度在$ pointer之前作为参数传递。上游手册页已更新为一个示例。