⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 signal.c

📁 linux进程跟踪的工具和源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		printsigmask(&sigm, 0);#ifndef USE_PROCFS		if ((tcp->u_arg[0] & sigmask(SIGTRAP))) {			/* Mark attempt to block SIGTRAP */			tcp->flags |= TCB_SIGTRAPPED;			/* Send unblockable signal */			kill(tcp->pid, SIGSTOP);		}#endif /* !USE_PROCFS */			}	else if (!syserror(tcp)) {		sigset_t sigm;		long_to_sigset(tcp->u_rval, &sigm);		tcp->auxstr = sprintsigmask("old mask ", &sigm, 0);		return RVAL_HEX | RVAL_STR;	}	return 0;}intsys_sigblock(tcp)struct tcb *tcp;{	return sys_sigsetmask(tcp);}#endif /* !SVR4 */#ifdef HAVE_SIGACTION#ifdef LINUXstruct old_sigaction {	__sighandler_t __sa_handler;	unsigned long sa_mask;	unsigned long sa_flags;	void (*sa_restorer)(void);};#define SA_HANDLER __sa_handler#endif /* LINUX */#ifndef SA_HANDLER                                                           #define SA_HANDLER sa_handler                                                #endifintsys_sigaction(tcp)struct tcb *tcp;{	long addr;#ifdef LINUX	sigset_t sigset;	struct old_sigaction sa;#else	struct sigaction sa;#endif	if (entering(tcp)) {		printsignal(tcp->u_arg[0]);		tprintf(", ");		addr = tcp->u_arg[1];	} else		addr = tcp->u_arg[2];	if (addr == 0)		tprintf("NULL");	else if (!verbose(tcp))		tprintf("%#lx", addr);	else if (umove(tcp, addr, &sa) < 0)		tprintf("{...}");	else {		switch ((long) sa.SA_HANDLER) {		case (long) SIG_ERR:			tprintf("{SIG_ERR}");			break;		case (long) SIG_DFL:			tprintf("{SIG_DFL}");			break;		case (long) SIG_IGN:#ifndef USE_PROCFS			if (tcp->u_arg[0] == SIGTRAP) {				tcp->flags |= TCB_SIGTRAPPED;				kill(tcp->pid, SIGSTOP);			}#endif /* !USE_PROCFS */			tprintf("{SIG_IGN}");			break;		default:#ifndef USE_PROCFS			if (tcp->u_arg[0] == SIGTRAP) {				tcp->flags |= TCB_SIGTRAPPED;				kill(tcp->pid, SIGSTOP);			}#endif /* !USE_PROCFS */			tprintf("{%#lx, ", (long) sa.SA_HANDLER);#ifndef LINUX			printsigmask (&sa.sa_mask, 0);#else			long_to_sigset(sa.sa_mask, &sigset);			printsigmask(&sigset, 0);#endif			tprintf(", ");			if (!printflags(sigact_flags, sa.sa_flags))				tprintf("0");			tprintf("}");		}	}	if (entering(tcp))		tprintf(", ");#ifdef LINUX	else		tprintf(", %#lx", (unsigned long) sa.sa_restorer);#endif	return 0;}intsys_signal(tcp)struct tcb *tcp;{	if (entering(tcp)) {		printsignal(tcp->u_arg[0]);		tprintf(", ");		switch (tcp->u_arg[1]) {		case (int) SIG_ERR:			tprintf("SIG_ERR");			break;		case (int) SIG_DFL:			tprintf("SIG_DFL");			break;		case (int) SIG_IGN:#ifndef USE_PROCFS			if (tcp->u_arg[0] == SIGTRAP) {				tcp->flags |= TCB_SIGTRAPPED;				kill(tcp->pid, SIGSTOP);			}#endif /* !USE_PROCFS */			tprintf("SIG_IGN");			break;		default:#ifndef USE_PROCFS			if (tcp->u_arg[0] == SIGTRAP) {				tcp->flags |= TCB_SIGTRAPPED;				kill(tcp->pid, SIGSTOP);			}#endif /* !USE_PROCFS */			tprintf("%#lx", tcp->u_arg[1]);		}		return 0;	}	else {		switch (tcp->u_rval) {		    case (int) SIG_ERR:			tcp->auxstr = "SIG_ERR"; break;		    case (int) SIG_DFL:			tcp->auxstr = "SIG_DFL"; break;		    case (int) SIG_IGN:			tcp->auxstr = "SIG_IGN"; break;		    default:			tcp->auxstr = NULL;		}		return RVAL_HEX | RVAL_STR;	}}intsys_sighold(tcp)struct tcb *tcp;{	if (entering(tcp)) {		printsignal(tcp->u_arg[0]);	}	return 0;}#endif /* HAVE_SIGACTION */#ifdef LINUXintsys_sigreturn(tcp)struct tcb *tcp;{#ifdef S390    long usp;    struct sigcontext_struct sc;    if (entering(tcp)) {	    tcp->u_arg[0] = 0;	    if (upeek(tcp->pid,PT_GPR15,&usp)<0)		    return 0;	    if (umove(tcp, usp+__SIGNAL_FRAMESIZE, &sc) < 0)		    return 0;	    tcp->u_arg[0] = 1;	    memcpy(&tcp->u_arg[1],&sc.oldmask[0],sizeof(sigset_t));    } else {	    tcp->u_rval = tcp->u_error = 0;	    if (tcp->u_arg[0] == 0)		    return 0;	    tcp->auxstr = sprintsigmask("mask now ",(sigset_t *)&tcp->u_arg[1]);	    return RVAL_NONE | RVAL_STR;    }    return 0;#else#ifdef I386	long esp;	struct sigcontext_struct sc;	if (entering(tcp)) {		tcp->u_arg[0] = 0;		if (upeek(tcp->pid, 4*UESP, &esp) < 0)			return 0;		if (umove(tcp, esp, &sc) < 0)			return 0;		tcp->u_arg[0] = 1;		tcp->u_arg[1] = sc.oldmask;	}	else {		sigset_t sigm;		long_to_sigset(tcp->u_arg[1], &sigm);		tcp->u_rval = tcp->u_error = 0;		if (tcp->u_arg[0] == 0)			return 0;		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);		return RVAL_NONE | RVAL_STR;	}	return 0;#else /* !I386 */#ifdef IA64	struct sigcontext sc;	long sp;	if (entering(tcp)) {		/* offset of sigcontext in the kernel's sigframe structure: */#		define SIGFRAME_SC_OFFSET	0x90		tcp->u_arg[0] = 0;		if (upeek(tcp->pid, PT_R12, &sp) < 0)			return 0;		if (umove(tcp, sp + 16 + SIGFRAME_SC_OFFSET, &sc) < 0)			return 0;		tcp->u_arg[0] = 1;		memcpy(tcp->u_arg + 1, &sc.sc_mask, sizeof(sc.sc_mask));	}	else {		sigset_t sigm;		memcpy(&sigm, tcp->u_arg + 1, sizeof (sigm));		tcp->u_rval = tcp->u_error = 0;		if (tcp->u_arg[0] == 0)			return 0;		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);		return RVAL_NONE | RVAL_STR;	}	return 0;#else /* !IA64 */#ifdef POWERPC       long esp;       struct sigcontext_struct sc;       if (entering(tcp)) {		   tcp->u_arg[0] = 0;		   if (upeek(tcp->pid, 4*PT_R1, &esp) < 0)			   return 0;		   if (umove(tcp, esp, &sc) < 0)			   return 0;		   tcp->u_arg[0] = 1;		   tcp->u_arg[1] = sc.oldmask;       }       else {		   sigset_t sigm;		   long_to_sigset(tcp->u_arg[1], &sigm);		   tcp->u_rval = tcp->u_error = 0;		   if (tcp->u_arg[0] == 0)			   return 0;		   tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);		   return RVAL_NONE | RVAL_STR;       }       return 0;#else /* !POWERPC */#ifdef M68K	long usp;	struct sigcontext sc;	if (entering(tcp)) {	    tcp->u_arg[0] = 0;	    if (upeek(tcp->pid, 4*PT_USP, &usp) < 0)			return 0;	    if (umove(tcp, usp, &sc) < 0)			return 0;	    tcp->u_arg[0] = 1;	    tcp->u_arg[1] = sc.sc_mask;	}	else {	    sigset_t sigm;	    long_to_sigset(tcp->u_arg[1], &sigm);	    tcp->u_rval = tcp->u_error = 0;	    if (tcp->u_arg[0] == 0)			return 0;	    tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);	    return RVAL_NONE | RVAL_STR;	}	return 0;#else /* !M68K */#ifdef ALPHA	long fp;	struct sigcontext_struct sc;	if (entering(tcp)) {	    tcp->u_arg[0] = 0;	    if (upeek(tcp->pid, REG_FP, &fp) < 0)			return 0;	    if (umove(tcp, fp, &sc) < 0)			return 0;	    tcp->u_arg[0] = 1;	    tcp->u_arg[1] = sc.sc_mask;	}	else {	    sigset_t sigm;	    long_to_sigset(tcp->u_arg[1], &sigm);	    tcp->u_rval = tcp->u_error = 0;	    if (tcp->u_arg[0] == 0)			return 0;	    tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);	    return RVAL_NONE | RVAL_STR;	}	return 0;#else#ifdef SPARC	long i1;	struct regs regs;	m_siginfo_t si;	if(ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0) {	    perror("sigreturn: PTRACE_GETREGS ");	    return 0;	}	if(entering(tcp)) {		tcp->u_arg[0] = 0;		i1 = regs.r_o1;		if(umove(tcp, i1, &si) < 0) {			perror("sigreturn: umove ");			return 0;		}		tcp->u_arg[0] = 1;		tcp->u_arg[1] = si.si_mask;	} else {		sigset_t sigm;		long_to_sigset(tcp->u_arg[1], &sigm);		tcp->u_rval = tcp->u_error = 0;		if(tcp->u_arg[0] == 0)			return 0;		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);		return RVAL_NONE | RVAL_STR;	}	return 0;#else  #ifdef MIPS	long sp;	struct sigcontext sc;	if(entering(tcp)) {	  	tcp->u_arg[0] = 0;		if (upeek(tcp->pid, REG_SP, &sp) < 0)		  	return 0;		if (umove(tcp, sp, &sc) < 0)		  	return 0;		tcp->u_arg[0] = 1;		tcp->u_arg[1] = sc.sc_sigset;	} else {	  	tcp->u_rval = tcp->u_error = 0;		if(tcp->u_arg[0] == 0)		  	return 0;		tcp->auxstr = sprintsigmask("mask now ", tcp->u_arg[1]);		return RVAL_NONE | RVAL_STR;	}	return 0;#else#ifdef HPPA#warning NO sys_sigreturn DECODE FOR HPPA	return 0;#endif /* HPPA */#endif /* MIPS */#endif /* SPARC */#endif /* ALPHA */#endif /* !M68K */#endif /* !POWERPC */#endif /* !IA64 */#endif /* !I386 */#endif /* S390 */}intsys_siggetmask(tcp)struct tcb *tcp;{	if (exiting(tcp)) {		sigset_t sigm;		long_to_sigset(tcp->u_rval, &sigm);		tcp->auxstr = sprintsigmask("mask ", &sigm, 0);	}	return RVAL_HEX | RVAL_STR;}intsys_sigsuspend(tcp)struct tcb *tcp;{	if (entering(tcp)) {		sigset_t sigm;		long_to_sigset(tcp->u_arg[2], &sigm);#if 0		/* first two are not really arguments, but print them anyway */		/* nevermind, they are an anachronism now, too bad... */		tprintf("%d, %#x, ", tcp->u_arg[0], tcp->u_arg[1]);#endif		printsigmask(&sigm, 0);	}	return 0;}#endif /* LINUX */#if defined(SVR4) || defined(FREEBSD)intsys_sigsuspend(tcp)struct tcb *tcp;{	sigset_t sigset;	if (entering(tcp)) {		if (umove(tcp, tcp->u_arg[0], &sigset) < 0)			tprintf("[?]");		else			printsigmask(&sigset, 0);	}	return 0;}#ifndef FREEBSDstatic struct xlat ucontext_flags[] = {	{ UC_SIGMASK,	"UC_SIGMASK"	},	{ UC_STACK,	"UC_STACK"	},	{ UC_CPU,	"UC_CPU"	},#ifdef UC_FPU	{ UC_FPU,	"UC_FPU"	},#endif#ifdef UC_INTR	{ UC_INTR,	"UC_INTR"	},#endif	{ 0,		NULL		},};#endif /* !FREEBSD */#endif /* SVR4 || FREEBSD */#if defined SVR4 || defined LINUX || defined FREEBSD#if defined LINUX && !defined SS_ONSTACK#define SS_ONSTACK      1#define SS_DISABLE      2#if __GLIBC_MINOR__ == 0typedef struct{	__ptr_t ss_sp;	int ss_flags;	size_t ss_size;} stack_t;#endif#endif#ifdef FREEBSD#define stack_t struct sigaltstack#endifstatic struct xlat sigaltstack_flags[] = {	{ SS_ONSTACK,	"SS_ONSTACK"	},	{ SS_DISABLE,	"SS_DISABLE"	},	{ 0,		NULL		},};#endif#ifdef SVR4static voidprintcontext(tcp, ucp)struct tcb *tcp;ucontext_t *ucp;{	tprintf("{");	if (!abbrev(tcp)) {		tprintf("uc_flags=");		if (!printflags(ucontext_flags, ucp->uc_flags))			tprintf("0");		tprintf(", uc_link=%#lx, ", (unsigned long) ucp->uc_link);	}	tprintf("uc_sigmask=");	printsigmask(ucp->uc_sigmask, 0);	if (!abbrev(tcp)) {		tprintf(", uc_stack={ss_sp=%#lx, ss_size=%d, ss_flags=",			(unsigned long) ucp->uc_stack.ss_sp,			ucp->uc_stack.ss_size);		if (!printflags(sigaltstack_flags, ucp->uc_stack.ss_flags))			tprintf("0");		tprintf("}");	}	tprintf(", ...}");}intsys_getcontext(tcp)struct tcb *tcp;{	ucontext_t uc;	if (exiting(tcp)) {		if (tcp->u_error)			tprintf("%#lx", tcp->u_arg[0]);		else if (!tcp->u_arg[0])			tprintf("NULL");		else if (umove(tcp, tcp->u_arg[0], &uc) < 0)			tprintf("{...}");		else			printcontext(tcp, &uc);	}	return 0;}intsys_setcontext(tcp)struct tcb *tcp;{	ucontext_t uc;	if (entering(tcp)) {		if (!tcp->u_arg[0])			tprintf("NULL");		else if (umove(tcp, tcp->u_arg[0], &uc) < 0)			tprintf("{...}");		else			printcontext(tcp, &uc);	}	else {		tcp->u_rval = tcp->u_error = 0;		if (tcp->u_arg[0] == 0)			return 0;		return RVAL_NONE;	}	return 0;}#endif /* SVR4 */#if defined(LINUX) || defined(FREEBSD)static intprint_stack_t(tcp, addr)struct tcb *tcp;unsigned long addr;{	stack_t ss;	if (umove(tcp, addr, &ss) < 0)		return -1;	tprintf("{ss_sp=%#lx, ss_flags=", (unsigned long) ss.ss_sp);	if (!printflags(sigaltstack_flags, ss.ss_flags))		tprintf("0");	tprintf(", ss_size=%lu}", (unsigned long) ss.ss_size);	return 0;}intsys_sigaltstack(tcp)	struct tcb *tcp;{	if (entering(tcp)) {		if (tcp->u_arg[0] == 0)			tprintf("NULL");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -