Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Aug 2013 15:10:13 -0700
From:      Shrikanth Kamath <shrikanth07@gmail.com>
To:        freebsd-hackers@freebsd.org
Subject:   User Space DTrace and dumping function arguments for user space
Message-ID:  <CAEOAkMVrJ7bfCaDLDOFzN=VQ6KGyUXc6pSNjGooB9TN0zpmJiQ@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Can we dump function arguments for user space functions just like for functions
in kernel space? Can FBT provider dump arguments for user space functions if we
do dtrace -l -f <function name> -v?

I was DTrace'ing "top" utility, (the "top" utility has both
the CTF and the Dwarf debug sections built in the object file)

I am trying to inspect get_system_info function called by "top", I
confirm it is present to be probed

    root% dtrace -l | grep get_system_info
    55154  pid8488      top        get_system_info entry

But I cannot dump the arguments to the function...
root% dtrace -l -f get_system_info -v
   ID   PROVIDER            MODULE                          FUNCTION NAME
55154    pid8488               top                   get_system_info entry

        Probe Description Attributes
                Identifier Names: Private
                Data Semantics:   Private
                Dependency Class: Unknown

        Argument Attributes
                Identifier Names: Private
                Data Semantics:   Private
                Dependency Class: Unknown

        Argument Types
                None

Testing with a simple script,
    pid8488::get_system_info:entry
    {
        this->info = (struct system_info *)copyin(args[0],
sizeof(struct system_info));
        ...
    }

...if I use the args[0] notation it says the following,
 dtrace: failed to compile script top_d.d: line 17: index 0 is out of
range for pid8488::get_system_info:entry args[ ]

Instead if I replace with arg0, it compiles but the values are not
neccesarily sane.
Example the ncpus member of struct system_info shows a garbage value.

The complete script is
pid8488::get_system_info:entry
{
    this->info = (struct system_info *)copyin(arg0, sizeof(struct system_info));
    printf("last pid [%d] \n", this->info->last_pid);
}
pid8488::get_process_info:entry
{
    this->info = (struct system_info *)copyin(arg0, sizeof(struct system_info));
    printf("ncpus [%d] \n", this->info->ncpus);
}

Running this
55154         get_system_info:entry last pid [8513]
55155         get_process_info:entry ncpus [134558720]

Supposed to be showing number of cpus? Anything wrong with the scripting?



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAEOAkMVrJ7bfCaDLDOFzN=VQ6KGyUXc6pSNjGooB9TN0zpmJiQ>