public inbox for systemtap@sourceware.org
 help / color / mirror / Atom feed
* accessing target globals with systemtap
@ 2012-09-11 22:12 Jeff Haran
  2012-09-12  0:17 ` Frank Ch. Eigler
  0 siblings, 1 reply; 5+ messages in thread
From: Jeff Haran @ 2012-09-11 22:12 UTC (permalink / raw)
  To: 'systemtap@sourceware.org'

Hi,

After reading the documentation, I assumed the following would result in the display of the address of the kernel global named arp_tbl:

[root@s01b06 jharan]# cat temp.stp
probe begin
{
        printf("arp_tbl %p\n", @var("arp_tbl@net/ipv4/arp.c"))
}

But when I try to compile it, I get this:

[root@s01b06 jharan]# stap -v -r 2.6.32-220.el6.x86_64 temp.stp -m temp -p 4
parse error: unknown statistic operator @var
        saw: identifier '@var' at temp.stp:3:25
     source:    printf("arp_tbl %p\n", @var("arp_tbl@net/ipv4/arp.c"))
                                       ^
parse error: expected statement
        saw: temp.stp EOF
2 parse errors.
Pass 1: parsed user script and 77 library script(s) using 97284virt/22908res/2984shr kb, in 140usr/0sys/144real ms.
Pass 1: parse failed.  Try again with another '--vp 1' option.
[root@s01b06 jharan]#

I am guessing that's because of my older version of stap:

[root@s01b06 jharan]# stap --version
Systemtap translator/driver (version 1.6/0.152 non-git sources)
Copyright (C) 2005-2011 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
enabled features: AVAHI LIBRPM LIBSQLITE3 NSS BOOST_SHARED_PTR TR1_UNORDERED_MAP NLS
[root@s01b06 jharan]#

Is there a way for me to get access to a kernel global in my version of stap?
Or do I need to upgrade in order to do this?
Or am I missing something more basic?

Thanks,

Jeff Haran

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: accessing target globals with systemtap
  2012-09-11 22:12 accessing target globals with systemtap Jeff Haran
@ 2012-09-12  0:17 ` Frank Ch. Eigler
  2012-09-12  1:00   ` Jeff Haran
  0 siblings, 1 reply; 5+ messages in thread
From: Frank Ch. Eigler @ 2012-09-12  0:17 UTC (permalink / raw)
  To: Jeff Haran; +Cc: 'systemtap@sourceware.org'

Jeff Haran <Jeff.Haran@citrix.com> writes:

> [...]
> probe begin
> {
>         printf("arp_tbl %p\n", @var("arp_tbl@net/ipv4/arp.c"))
> }

This won't work for a few more reasons.

@var() resolves within the context of the probe point.  probe begin
does not offer a useful context -- it doesn't say e.g. whether this
is a kernel or userspace program whose "arp_tbl" you're looking for.
Try instead printing this value from a kernel.function type probe.

Second, @var("arp_tbl") will result in a struct neigh_table, something
that cannot be printed with a %p.  Systemtap will give you a type
mismatch error, unless e.g. you print  & @var(...)  to print the address.
(You can hex-dump the structure via printf("%*m") etc.)

> [...]
> I am guessing that's because of my older version of stap:

That's correct.

> [root@s01b06 jharan]# stap --version
> Systemtap translator/driver (version 1.6/0.152 non-git sources)
> [...]

> Is there a way for me to get access to a kernel global in my version of stap?
> Or do I need to upgrade in order to do this?

Another way would be to use embedded-C:

%{ 
#include <net/arp.h>
%}
function the_table_address:long () %{ /* unmangled */
  /* rely on EXPORT_SYMBOL ... to let this resolve */
  THIS->__retvalue = & arp_tbl;
%}
probe begin {
  // to find the base address
  printf("%p\n", the_table_address())
  // to fetch fields:
  printf("%d\n", @cast(the_table_address(),"neigh_table","kernel")->family);
}


> Or am I missing something more basic?

Nope.

- FChE

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: accessing target globals with systemtap
  2012-09-12  0:17 ` Frank Ch. Eigler
@ 2012-09-12  1:00   ` Jeff Haran
  2012-09-12  1:42     ` Jeff Haran
  2012-09-12 11:17     ` Frank Ch. Eigler
  0 siblings, 2 replies; 5+ messages in thread
From: Jeff Haran @ 2012-09-12  1:00 UTC (permalink / raw)
  To: 'Frank Ch. Eigler'; +Cc: 'systemtap@sourceware.org'

> -----Original Message-----
> From: Frank Ch. Eigler [mailto:fche@redhat.com]
> Sent: Tuesday, September 11, 2012 5:16 PM
> To: Jeff Haran
> Cc: 'systemtap@sourceware.org'
> Subject: Re: accessing target globals with systemtap
> 
...
> Try instead printing this value from a kernel.function type probe.

Frank,

Thanks a bunch for helping me through this. I did try another kernel.function type probe after reading some related email. I figured arp_init() in net/ipv4/arp.c would have arp_tbl in its scope and it should get called before the functions I am interesting in having the value of arp_tbl in:

171 struct neigh_table arp_tbl = {
...
1235 void __init arp_init(void)
1236 {
1237         neigh_table_init(&arp_tbl);
1238
1239         dev_add_pack(&arp_packet_type);
1240         arp_proc_init();
1241 #ifdef CONFIG_SYSCTL
1242         neigh_sysctl_register(NULL, &arp_tbl.parms, NET_IPV4,
1243                               NET_IPV4_NEIGH, "ipv4", NULL, NULL);
1244 #endif
1245         register_netdevice_notifier(&arp_netdev_notifier);
1246 }

But that yields this:

[root@s01b06 jharan]# cat temp2.stp
global arp_tbl

probe kernel.function("arp_init").call
{
        arp_tbl = &$arp_tbl
}

[root@s01b06 jharan]# stap -v -r 2.6.32-220.el6.x86_64 temp2.stp -m temp2 -p 4
Pass 1: parsed user script and 77 library script(s) using 97284virt/22832res/2912shr kb, in 130usr/10sys/143real ms.
semantic error: no match while resolving probe point kernel.function("arp_init").call
Pass 2: analyzed script: 0 probe(s), 0 function(s), 0 embed(s), 1 global(s) using 249284virt/122356res/79740shr kb, in 410usr/70sys/484real ms.
Pass 2: analysis failed.  Try again with another '--vp 01' option.
[root@s01b06 jharan]#

I also tried this (leaving out  the '&'), just to see if that would change what it was complaining about:

[root@s01b06 jharan]# cat temp2.stp
global arp_tbl

probe kernel.function("arp_init").call
{
        arp_tbl = $arp_tbl
}

[root@s01b06 jharan]# stap -v -r 2.6.32-220.el6.x86_64 temp2.stp -m temp2 -p 4
Pass 1: parsed user script and 77 library script(s) using 97284virt/22836res/2912shr kb, in 120usr/10sys/139real ms.
semantic error: no match while resolving probe point kernel.function("arp_init").call
Pass 2: analyzed script: 0 probe(s), 0 function(s), 0 embed(s), 1 global(s) using 249288virt/122360res/79740shr kb, in 400usr/70sys/463real ms.
Pass 2: analysis failed.  Try again with another '--vp 01' option.
[root@s01b06 jharan]#

From the error messages, it seems like it's having problems with finding arp_init() rather than any particular problem with the probe body.

Is this because arp_init is declared with __init?

I also tried kernel.statement instead:

[root@s01b06 jharan]# cat temp3.stp
global arp_tbl

probe kernel.statement("*@net/ipv4/arp.c:1238")
{
        arp_tbl = $arp_tbl
}
[root@s01b06 jharan]# stap -v -r 2.6.32-220.el6.x86_64 temp3.stp -m temp3 -p 4
Pass 1: parsed user script and 77 library script(s) using 97284virt/22832res/2912shr kb, in 130usr/0sys/139real ms.
semantic error: no match while resolving probe point kernel.statement("*@net/ipv4/arp.c:1238")
Pass 2: analyzed script: 0 probe(s), 0 function(s), 0 embed(s), 1 global(s) using 267124virt/76472res/17420shr kb, in 170usr/80sys/238real ms.
Pass 2: analysis failed.  Try again with another '--vp 01' option.
[root@s01b06 jharan]#

I think I have that kernel.statement syntax right. This one did work as expected and it looks pretty much the same:

probe kernel.statement("*@net/core/neighbour.c:934")
...

It seems like it just can't find that arp_init code, regardless of the probe body.

Is there something I need to do in order to roll kernel.function or kernel.statement in order to probe arp_init()?

Also, what is the recommended way of getting the address of an in-scope structure instance?

As you've pointed out this is wrong:

        arp_tbl = $arp_tbl

Is this the way to do it?

        arp_tbl = &$arp_tbl

> > Is there a way for me to get access to a kernel global in my version of stap?
> 
> Another way would be to use embedded-C:
> 
> %{
> #include <net/arp.h>
> %}
> function the_table_address:long () %{ /* unmangled */
>   /* rely on EXPORT_SYMBOL ... to let this resolve */
>   THIS->__retvalue = & arp_tbl;
> %}
> probe begin {
>   // to find the base address
>   printf("%p\n", the_table_address())
>   // to fetch fields:
>   printf("%d\n", @cast(the_table_address(),"neigh_table","kernel")-
> >family);
> }

I'll give this embedded C a try.

Thanks again,

Jeff Haran

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: accessing target globals with systemtap
  2012-09-12  1:00   ` Jeff Haran
@ 2012-09-12  1:42     ` Jeff Haran
  2012-09-12 11:17     ` Frank Ch. Eigler
  1 sibling, 0 replies; 5+ messages in thread
From: Jeff Haran @ 2012-09-12  1:42 UTC (permalink / raw)
  To: 'Frank Ch. Eigler'; +Cc: 'systemtap@sourceware.org'

> -----Original Message-----
> From: systemtap-owner@sourceware.org [mailto:systemtap-
> owner@sourceware.org] On Behalf Of Jeff Haran
> Sent: Tuesday, September 11, 2012 6:00 PM
> To: 'Frank Ch. Eigler'
> Cc: 'systemtap@sourceware.org'
> Subject: RE: accessing target globals with systemtap
... 
> > > Is there a way for me to get access to a kernel global in my version of
> stap?
> >
> > Another way would be to use embedded-C:
> >
> > %{
> > #include <net/arp.h>
> > %}
> > function the_table_address:long () %{ /* unmangled */
> >   /* rely on EXPORT_SYMBOL ... to let this resolve */
> >   THIS->__retvalue = & arp_tbl;
> > %}
> > probe begin {
> >   // to find the base address
> >   printf("%p\n", the_table_address())
> >   // to fetch fields:
> >   printf("%d\n", @cast(the_table_address(),"neigh_table","kernel")-
> > >family);
> > }
> 
> I'll give this embedded C a try.

Just an FYI for posterity. The above generated a warning in the C compilation pass, which since warnings are treated as errors meant no .ko file was produced.

But replacing this:

	THIS->__retvalue = & arp_tbl;

with this:

	THIS->__retvalue = (int64_t) & arp_tbl;

built fine and it seems to have worked right too:

[root@s01b05 jharan]# staprun temp4.ko
0xffffffff81b157c0
2
^C[root@s01b05 jharan]#

Thanks again,

Jeff Haran

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: accessing target globals with systemtap
  2012-09-12  1:00   ` Jeff Haran
  2012-09-12  1:42     ` Jeff Haran
@ 2012-09-12 11:17     ` Frank Ch. Eigler
  1 sibling, 0 replies; 5+ messages in thread
From: Frank Ch. Eigler @ 2012-09-12 11:17 UTC (permalink / raw)
  To: Jeff Haran; +Cc: 'systemtap@sourceware.org'

Hi -

On Tue, Sep 11, 2012 at 05:59:58PM -0700, Jeff Haran wrote:
> [...]
> 1235 void __init arp_init(void)
> [...]

It does look like a tasty little tidbit.  Unfortunately, __init
functions in the kernel are normally tossed into the memory hole right
after bootup, so are not available for probing by the time we proles
come along.  With a "stap --vp 02" option added, you'll get a hint at
the problem:

probe arp_init@net/ipv4/arp.c:1276 kernel reloc=.dynamic pc=0xffffffff81bb7f6f init/exit - skipped


> [...]
> Also, what is the recommended way of getting the address of an in-scope structure instance?
> 
> As you've pointed out this is wrong:
>         arp_tbl = $arp_tbl
> Is this the way to do it?
>         arp_tbl = &$arp_tbl

Yes.



- FChE

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-09-12 11:17 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-11 22:12 accessing target globals with systemtap Jeff Haran
2012-09-12  0:17 ` Frank Ch. Eigler
2012-09-12  1:00   ` Jeff Haran
2012-09-12  1:42     ` Jeff Haran
2012-09-12 11:17     ` Frank Ch. Eigler

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).