This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re: Queries on SystemTap - with focus on User Space debugging
- From: Manjusha Ajay <manjusha dot ajay at gmail dot com>
- To: Josh Stone <jistone at redhat dot com>
- Cc: "Frank Ch. Eigler" <fche at redhat dot com>, systemtap at sourceware dot org, adrien at kunysz dot be
- Date: Fri, 27 May 2011 10:56:11 +0530
- Subject: Re: Queries on SystemTap - with focus on User Space debugging
- References: <4ddc870c.c9cae30a.71aa.04da@mx.google.com> <OFC45DE291.D6E993B3-ON6525789C.00234213-6525789C.00324BA5@ibsplc.com> <BANLkTi=wWUbJkE0gVV+PqQnrCcFP3UTsBA@mail.gmail.com> <20110526102354.GA1330@redhat.com> <4DDE8229.2020108@redhat.com>
Hi Josh,
> So try something like:
>
> probe signal.send {
> if (sig == 11 && sig_pid == target()) {
> print_ubacktrace()
> }
> }
>
>
Tried filtering signal 11 in the probe 'signal.send' , but
print_ubacktrace() was giving me a kernel space backtrace.
Is it possible to get user-space backtrace from a kernel probe?
Manjusha
On Thu, May 26, 2011 at 10:09 PM, Josh Stone <jistone@redhat.com> wrote:
> On 05/26/2011 03:23 AM, Frank Ch. Eigler wrote:
>> Hi -
>>
>> On Thu, May 26, 2011 at 03:24:54PM +0530, Manjusha Ajay wrote:
>>> [...]
>>> probe kernel.function("send_sig") {
>>> if ($sig == 11 && p && task_pid(p) == target()) {
>>> ? ? ?print_ubacktrace()
>>> ? }
>>> }
>>>
>>> Also got a warning when I ran the above script
>>>
>>>> stap -c "./test_segfault' test.stp
>>> WARNING: ?read-only local variable 'p' ?: identifier 'p' at test.stp:19:20
>>
>> Ah yes, an appropriate warning: I meant $p instead of p above,
>> since we're trying to extract the p parameter from the context
>> of the send_sig function call.
>>
>> It appears difficult to place an architecture-neutral kernel probe at
>> the point where a page fault is about to be declared a SIGSEGV type
>> error. ?Might try kernel.function("force_sig_info") instead,
>> filtering on $sig==11.
>
> We have a predefined tapset that is supposed to cover all the different
> ways signals can be sent, documented thusly:
>
> /**
> ?* probe signal.send - Signal being sent to a process
> ?* Arguments:
> ?* @sig: The number of the signal
> ?* @sig_name: A string representation of the signal
> ?* @sig_pid: The PID of the process receiving the signal
> ?* @pid_name: The name of the signal recipient
> ?* @si_code: Indicates the signal type
> ?* @task: A task handle to the signal recipient
> ?* @sinfo: The address of siginfo struct
> ?* @shared: Indicates whether the signal is shared by the thread group
> ?* @send2queue: Indicates whether the signal is sent to an existing
> ?* sigqueue
> ?* @name: The name of the function used to send out the signal
> ?*
> ?* Context:
> ?* ?The signal's sender.
> ?*
> ?*/
>
> So try something like:
>
> ?probe signal.send {
> ? ?if (sig == 11 && sig_pid == target()) {
> ? ? ?print_ubacktrace()
> ? ?}
> ?}
>
>