public inbox for systemtap@sourceware.org
 help / color / mirror / Atom feed
* [Fwd: Re: Systemtap probe for Signals]
@ 2006-08-03  1:40 Li Guanglei
  0 siblings, 0 replies; only message in thread
From: Li Guanglei @ 2006-08-03  1:40 UTC (permalink / raw)
  To: systemtap

[-- Attachment #1: Type: text/plain, Size: 2377 bytes --]

Hi,

   An updated signal tapset from Manoj.

   The current process.stp has "probe process.signal_send". So we just 
leave it alone or move it into the signal.stp?

- Guanglei

-------- ???? --------
??: 	Re: Systemtap probe for Signals
??: 	Wed, 2 Aug 2006 12:56:00 +0530
???: 	Manoj S Pattabhiraman <mpattabh@in.ibm.com>
???: 	Li Guanglei <guanglei@cn.ibm.com>




Hi,

I have updated the signal tapset, with the functions you have asked for.
Since i would not be able to send it to the maillist, please post this
mail.

Lemme know your suggestions ..



Regarding the send_signal and send*_sigqueue, i would rather prefer to
leave as it is.

*Thanks & Regards,    Manoj*
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Manoj S Pattabhiraman, ADTools, Linux on zSeries, Ph : +91 80 51776449
T/L  92 46951, e-mail: mpattabh@in.ibm.com


*Li Guanglei <guanglei@cn.ibm.com>*
Sent by: systemtap-owner@sourceware.org

07/28/2006 01:36 PM

	
To
	"systemtap@sourceware.org" <systemtap@sourceware.org>
cc
	Manoj S Pattabhiraman/India/IBM@IBMIN
Subject
	Re: Systemtap probe for Signals


	





Hi,

  Beside the probe points in your tapset, I'd like to probe the
following signal related kernel functions:

  1. do_sigpending
     It is used to suspend signals. Called by sys_rt_sigpending and
sys_sigpending

  2. handle_signal
     It is called when the kernel want to invoke the signal handlers.
Called by do_signal.

  3. do_sigaction
     It is called by sys_sigaction, compat_sys_rt_sigaction,
compat_sys_rt_sigaction, sys_rt_sigaction, sys_signal. It is
corresponding to the signal() and sigaction() calles from use app.

  4. sigprocmask
     It is called by sys_sigprocmask, sys_rt_sigprocmask.

   And I found you put a point on sig_ignored. But I don't think
sig_ignored is used to ignore a signal. It is only used to check
whether or not a signal has been ignored.

   And another comment is about signal.sendsig and
signal.send_sig_queue. The difference between send_signal and
send*sigqueue is that send_signal will alloc a sigqueue before adding
a signal into that queue. But their intention are almost the same:
sending a signal to a process. I am not sure whether we could combine
them into one probe or leave it unchanged.

- Guanglei




[-- Attachment #2: signal.stp --]
[-- Type: application/octet-stream, Size: 7685 bytes --]

// Signal tapset
// Copyright (C) 2006 IBM Corp.
//
// This file is part of systemtap, and is free software.  You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.
//
//   Note : Since there are so many signals sent to processes at any give point, Its better to filter the
//          the information according to the requirements. for example, filter only for a particular
//          signal (if sig==2)  or filter only for a particular process ( if pid_name==stap )
//

/* probe signal.sendsig
 *
 * Fires when a signal is sent to a process.
 * 
 */

 probe signal.sendsig = kernel.function("send_signal")
 {   
	sig=$sig
 	sig_name = _signal_name($sig)
	sinfo = $info
	sig_pid = $t->pid
	pid_name = kernel_string($t->comm)
	
	if (sinfo == 2)
		si_code ="SIGSTOP or SIGKILL" 
	else if (sinfo > 0) 
		si_code="SI_KERNEL (SIGFPE, SIGSEGV, SIGTRAP, SIGCHLD, SIGPOLL)" 
	else if (sinfo <= 0) 
		si_code="SI_USER or SI_TIMER or SI_ASYNCIO" 	
	
	argstr = sprintf( "Signal : %s - Process name : %s (%d) - Signal Code : %s ", sig_name,sig_pid,pid_name,si_code)
}	

/* probe signal.wakeup
 *
 * Wake up the process for new active signals.
 *
 */

probe signal.wakeup =
        kernel.function("signal_wake_up")
{
   sig_pid = $t->pid
   pid_name = kernel_string($t->comm)
   state   = $resume
   if (state == 0)     {
                sig_state = "TASK_INTERRUPTIBLE"
         } else
                {
                sig_state = "TASK_INTERRUPTIBLE | TASK_STOPPED | TASK_TRACED"
        }
  argstr = sprintf( "Wakeup Signal to Process %s (%d) - Process State after the signal : %s ",pid_name,sig_pid,sig_state)	
}

/* probe signal.ignored
 *
 *  Checks whether the signal is ignored or not.
 *
 */

probe signal.ignored = kernel.function("sig_ignored")
 {
	sig_pid = $t->pid
	pid_name = kernel_string($t->comm) 
	sig_info = $sig
	sig_name = _signal_name($sig)
	argstr = sprintf( "Signal : %s is ignored by the Process : %s (%d) ",sig_name,pid_name,sig_pid)
 } 	

probe signal.ignored.return = kernel.function("sig_ignored").return 
{
        name = "sig_ignored"
        retstr = returnstr(1)
}

/* probe signal.handle_stopsig
 *
 *  Fires when a stop signal is sent to a process.
 *
 */

 probe signal.handle_stopsig = kernel.function("handle_stop_signal")
 {
        sig_pid = $p->pid
        pid_name = kernel_string($p->comm)
        sig_info = $sig
	sig_name = _signal_name($sig)
	argstr = sprintf(" Handle_Stop_Signal : %s is sent to the process %s (%d)",sig_name,pid_name,sig_pid);
}

/* probe signal.forcesig
 *
 *  Forces SIGSEV when there are some issues while handling signals for the process.
 * 
 */

probe signal.forcesig = kernel.function("force_sigsegv")
 {
        sig_pid = $p->pid
        pid_name = kernel_string($p->comm)
        sig_info = $sig
	sig_name = _signal_name($sig)
        argstr = sprintf("Signal < %d > is forced on to the process %s (%d)",sig_name,pid_name,sig_pid);
}

probe signal.forcesig.return = kernel.function("force_sigsegv").return
{
        name = "force_sigsegv"
        retstr = returnstr(1)
}

/* probe signal.syskill
 *
 *  To kill a process, Pass the pid and signal to kill the process.
 *
 */

probe signal.syskill = kernel.function("sys_kill")
 {
        sig_pid = $pid
        sig_info = $sig
        argstr = sprintf("Process %d has recieved a Signal %s ",sig_pid,sig_name);
}

probe signal.syskill.return = kernel.function("sys_kill").return
{
        name = "sys_kill"
        retstr = returnstr(1)
}

/* probe signal.sys_tgkill
 *
 *  Sends a signal to one specific thread.
 *
 */

probe signal.systgkill = kernel.function("sys_tgkill")
 {
	sig_tgid = $tgid
        sig_pid = $pid
        sig_info = $sig
	sig_name = _signal_name($sig)
        argstr = sprintf(" Signal %s is sent to Process ID : %d under the Thread Group ID : %d",sig_name,sig_pid,sig_tgid);
}

probe signal.systgkill.return = kernel.function("sys_tgkill").return
{
        name = "sys_tgkill"
        retstr = returnstr(1)
}


/* probe signal.sys_tkill
 *
 *  Sends a signal to one specific task.
 *
 */

probe signal.systkill = kernel.function("sys_tkill")
 {
        sig_pid = $pid
        sig_info = $sig
	sig_name = _signal_name($sig)
        argstr = sprintf("Signal %s is sent to Process ID : %d ",sig_name,sig_pid);
}

probe signal.systkill.return = kernel.function("sys_tkill").return
{
        name = "sys_tkill"
        retstr = returnstr(1)
}

/* probe signal.send_sig_queue
 * 
 * Queue signal to a process.
 * 
 */
probe signal.send_sig_queue =
        kernel.function("send_sigqueue"),
        kernel.function("send_group_sigqueue")
{
    sig_info = $sig
    sig_name = _signal_name($sig)	
    sig_pid = $p->pid
    pid_name = kernel_string($p->comm)
    user_id = $q->uid
    nos_process = $q->processes
    nos_pending_sig = $q->sigpending			
}

probe signal.send_sig_queue.return = 
	kernel.function("send_sigqueue").return,
	kernel.function("send_group_sigqueue").return
{
        retstr = returnstr(1)
}

/* probe signal.sigpend
 *
 * Used to Suspend signals 
 *
 * long do_sigpending(void __user *set, unsigned long sigsetsize)
 :*/

probe signal.sigpend = kernel.function("do_sigpending")
{
	uspace_add=$set 
	sset_size=$sigsetsize
}

probe signal.sigpend.return =
        kernel.function("do_sigpending").return
{
        retstr = returnstr(1)
}


/* probe signal.handsig
 *
 * Used to invoke signals
 *
 * static int handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, 
 *					sigset_t *oldset, struct pt_regs * regs)
 * Argument :-
 *  sig    : Signal number
 *  info   : address of siginfo table.	
 *  ka     : Address of the k_sigaction table associated with the signal
 *  oldset : Address of a bit mask array of blocked signals
 *  regs   : Address in the Kernel Mode stack area w
 *
 */

probe signal.handlesig = kernel.function("handle_signal")
{
	sig = $sig
	siginfo_add=$info
   	sig_stack_add=$ka
	bitmask_add=$oldset
	kernmode_stack_add=$regs
}

probe signal.handlesig.return =
        kernel.function("handle_signal").return
{
        retstr = returnstr(1)
}

/* probe signal.dosig_action
 *
 * Called by sys_sigaction() to copy the new new_ka table into the entry at the sig-1 position. 
 *
 * int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact)
 *
 * Argument :-
 *  sig    : Signal number
 *  act    : Address of the sigaction table associated with the signal
 *  oact   : Address of a previous sigaction table
 *
 */
probe signal.dosig_action = kernel.function("do_sigaction")
{
        sig = $sig
        siginfo_add=$info
        sig_stack_add=$ka
        bitmask_add=$oldset
        kernmode_stack_add=$regs
}

probe signal.dosig_action.return =
        kernel.function("do_sigaction").return
{
        retstr = returnstr(1)
}

/* probe signal.sigprocmask
 *
 * Allows processes to modify the set of blocked signals.
 *
 * int sigprocmask(int how, sigset_t *set, sigset_t *oldset)
 *
 * Argument :-
 *  how    : Flag having one of the values (SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK)
 *  set    : Address of the process address space to a bit array.
 *  oldset : Address of the process address space where the previous bit mask must be stored.
 *
 */

probe signal.sigprocmask = kernel.function("sigprocmask")
{
	stemp=$how
	sigset=$set
	sigoset=$oldset

        if (stemp == 0)
                sig_how ="SIG_BLOCK"
        else if (stemp ==  1)
                sig_how="SIG_UNBLOCK"
        else if (sinfo == 2)
                sig_how="SIG_SETMASK"
}

probe signal.sigprocmask.return =
        kernel.function("sigprocmask").return
{
        retstr = returnstr(1)
}



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2006-08-03  1:40 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-08-03  1:40 [Fwd: Re: Systemtap probe for Signals] Li Guanglei

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).