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

📄 util.c

📁 linux进程跟踪的工具和源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
					*s++ = str[i + j];				else					*s++ = '.';			}			else				*s++ = ' ';		}		tprintf("%s |\n", outstr);	}}#define PAGMASK	(~(PAGSIZ - 1))/* * move `len' bytes of data from process `pid' * at address `addr' to our space at `laddr' */intumoven(tcp, addr, len, laddr)struct tcb *tcp;long addr;int len;char *laddr;{#ifdef LINUX	int pid = tcp->pid;	int n, m;	int started = 0;	union {		long val;		char x[sizeof(long)];	} u;	if (addr & (sizeof(long) - 1)) {		/* addr not a multiple of sizeof(long) */		n = addr - (addr & -sizeof(long)); /* residue */		addr &= -sizeof(long); /* residue */		errno = 0;		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);		if (errno) {			if (started && (errno==EPERM || errno==EIO)) {				/* Ran into 'end of memory' - stupid "printpath" */				return 0;			}			/* But if not started, we had a bogus address. */			perror("ptrace: umoven");			return -1;		}		started = 1;		memcpy(laddr, &u.x[n], m = MIN(sizeof(long) - n, len));		addr += sizeof(long), laddr += m, len -= m;	}	while (len) {		errno = 0;		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);		if (errno) {			if (started && (errno==EPERM || errno==EIO)) {				/* Ran into 'end of memory' - stupid "printpath" */				return 0;			}			perror("ptrace: umoven");			return -1;		}		started = 1;		memcpy(laddr, u.x, m = MIN(sizeof(long), len));		addr += sizeof(long), laddr += m, len -= m;	}#endif /* LINUX */#ifdef SUNOS4	int pid = tcp->pid;#if 0	int n, m;	union {		long val;		char x[sizeof(long)];	} u;	if (addr & (sizeof(long) - 1)) {		/* addr not a multiple of sizeof(long) */		n = addr - (addr & -sizeof(long)); /* residue */		addr &= -sizeof(long); /* residue */		errno = 0;		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);		if (errno) {			perror("umoven");			return -1;		}		memcpy(laddr, &u.x[n], m = MIN(sizeof(long) - n, len));		addr += sizeof(long), laddr += m, len -= m;	}	while (len) {		errno = 0;		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0);		if (errno) {			perror("umoven");			return -1;		}		memcpy(laddr, u.x, m = MIN(sizeof(long), len));		addr += sizeof(long), laddr += m, len -= m;	}#else /* !oldway */	int n;	while (len) {		n = MIN(len, PAGSIZ);		n = MIN(n, ((addr + PAGSIZ) & PAGMASK) - addr);		if (ptrace(PTRACE_READDATA, pid,			   (char *) addr, len, laddr) < 0) {			perror("umoven: ptrace(PTRACE_READDATA, ...)");			abort();			return -1;		}		len -= n;		addr += n;		laddr += n;	}#endif /* !oldway */#endif /* SUNOS4 */#ifdef USE_PROCFS#ifdef HAVE_MP_PROCFS	if (pread(tcp->pfd_as, laddr, len, addr) == -1)		return -1;#else/* * We would like to use pread preferentially for speed * but even though SGI has it in their library, it no longer works. */#ifdef MIPS#undef HAVE_PREAD#endif#ifdef HAVE_PREAD	if (pread(tcp->pfd, laddr, len, addr) == -1)		return -1;#else /* !HAVE_PREAD */	lseek(tcp->pfd, addr, SEEK_SET);	if (read(tcp->pfd, laddr, len) == -1)		return -1;#endif /* !HAVE_PREAD */#endif /* HAVE_MP_PROCFS */#endif /* USE_PROCFS */	return 0;}/* * like `umove' but make the additional effort of looking * for a terminating zero byte. */intumovestr(tcp, addr, len, laddr)struct tcb *tcp;long addr;int len;char *laddr;{#ifdef USE_PROCFS	return umoven(tcp, addr, len, laddr);#else /* !USE_PROCFS */	int started = 0;	int pid = tcp->pid;	int i, n, m;	union {		long val;		char x[sizeof(long)];	} u;	if (addr & (sizeof(long) - 1)) {		/* addr not a multiple of sizeof(long) */		n = addr - (addr & -sizeof(long)); /* residue */		addr &= -sizeof(long); /* residue */		errno = 0;		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);		if (errno) {			if (started && (errno==EPERM || errno==EIO)) {				/* Ran into 'end of memory' - stupid "printpath" */				return 0;			}			perror("umovestr");			return -1;		}		started = 1;		memcpy(laddr, &u.x[n], m = MIN(sizeof(long)-n,len));		while (n & (sizeof(long) - 1))			if (u.x[n++] == '\0')				return 0;		addr += sizeof(long), laddr += m, len -= m;	}	while (len) {		errno = 0;		u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0);		if (errno) {			if (started && (errno==EPERM || errno==EIO)) {				/* Ran into 'end of memory' - stupid "printpath" */				return 0;			}			perror("umovestr");			return -1;		}		started = 1;		memcpy(laddr, u.x, m = MIN(sizeof(long), len));		for (i = 0; i < sizeof(long); i++)			if (u.x[i] == '\0')				return 0;		addr += sizeof(long), laddr += m, len -= m;	}	return 0;#endif /* !USE_PROCFS */}#ifdef LINUX#ifndef SPARC#define PTRACE_WRITETEXT	101#define PTRACE_WRITEDATA	102#endif /* !SPARC */#endif /* LINUX */#ifdef SUNOS4static intuload(cmd, pid, addr, len, laddr)int cmd;int pid;long addr;int len;char *laddr;{#if 0	int n;	while (len) {		n = MIN(len, PAGSIZ);		n = MIN(n, ((addr + PAGSIZ) & PAGMASK) - addr);		if (ptrace(cmd, pid, (char *)addr, n, laddr) < 0) {			perror("uload: ptrace(PTRACE_WRITE, ...)");			return -1;		}		len -= n;		addr += n;		laddr += n;	}#else	int peek, poke;	int n, m;	union {		long val;		char x[sizeof(long)];	} u;	if (cmd == PTRACE_WRITETEXT) {		peek = PTRACE_PEEKTEXT;		poke = PTRACE_POKETEXT;	}	else {		peek = PTRACE_PEEKDATA;		poke = PTRACE_POKEDATA;	}	if (addr & (sizeof(long) - 1)) {		/* addr not a multiple of sizeof(long) */		n = addr - (addr & -sizeof(long)); /* residue */		addr &= -sizeof(long);		errno = 0;		u.val = ptrace(peek, pid, (char *) addr, 0);		if (errno) {			perror("uload: POKE");			return -1;		}		memcpy(&u.x[n], laddr, m = MIN(sizeof(long) - n, len));		if (ptrace(poke, pid, (char *)addr, u.val) < 0) {			perror("uload: POKE");			return -1;		}		addr += sizeof(long), laddr += m, len -= m;	}	while (len) {		if (len < sizeof(long))			u.val = ptrace(peek, pid, (char *) addr, 0);		memcpy(u.x, laddr, m = MIN(sizeof(long), len));		if (ptrace(poke, pid, (char *) addr, u.val) < 0) {			perror("uload: POKE");			return -1;		}		addr += sizeof(long), laddr += m, len -= m;	}#endif	return 0;}inttload(pid, addr, len, laddr)int pid;int addr, len;char *laddr;{	return uload(PTRACE_WRITETEXT, pid, addr, len, laddr);}intdload(pid, addr, len, laddr)int pid;int addr;int len;char *laddr;{	return uload(PTRACE_WRITEDATA, pid, addr, len, laddr);}#endif /* SUNOS4 */#ifndef USE_PROCFSintupeek(pid, off, res)int pid;long off;long *res;{	long val;#ifdef SUNOS4_KERNEL_ARCH_KLUDGE	{		static int is_sun4m = -1;		struct utsname name;		/* Round up the usual suspects. */		if (is_sun4m == -1) {			if (uname(&name) < 0) {				perror("upeek: uname?");				exit(1);			}			is_sun4m = strcmp(name.machine, "sun4m") == 0;			if (is_sun4m) {				extern struct xlat struct_user_offsets[];				struct xlat *x;				for (x = struct_user_offsets; x->str; x++)					x->val += 1024;			}		}		if (is_sun4m)			off += 1024;	}#endif /* SUNOS4_KERNEL_ARCH_KLUDGE */	errno = 0;	val = ptrace(PTRACE_PEEKUSER, pid, (char *) off, 0);	if (val == -1 && errno) {		perror("upeek: ptrace(PTRACE_PEEKUSER, ... )");		return -1;	}	*res = val;	return 0;}#endif /* !USE_PROCFS */longgetpc(tcp)struct tcb *tcp;{#ifdef LINUX	long pc;#if defined(I386)	if (upeek(tcp->pid, 4*EIP, &pc) < 0)		return -1;#elif defined(IA64)	if (upeek(tcp->pid, PT_B0, &pc) < 0)		return -1;#elif defined(ARM)	if (upeek(tcp->pid, 4*15, &pc) < 0)		return -1;#elif defined(POWERPC)	if (upeek(tcp->pid, 4*PT_NIP, &pc) < 0)		return -1;#elif defined(M68k)	if (upeek(tcp->pid, 4*PT_PC, &pc) < 0)		return -1;#elif defined(ALPHA)	if (upeek(tcp->pid, REG_PC, &pc) < 0)		return -1;#elif defined(MIPS) 	if (upeek(tcp->pid, REG_EPC, &pc) < 0) 		return -1;#elif defined(SPARC)	struct regs regs;	if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)&regs,0) < 0)		return -1;	pc = regs.r_pc;#elif defined(S390)	if(upeek(tcp->pid,PT_PSWADDR,&pc) < 0)#elif defined(HPPA)	if(upeek(tcp->pid,PT_IAOQ0,&pc) < 0)		return -1;#endif	return pc;#endif /* LINUX */#ifdef SUNOS4	/*	 * Return current program counter for `pid'	 * Assumes PC is never 0xffffffff	 */	struct regs regs;	if (ptrace(PTRACE_GETREGS, tcp->pid, (char *) &regs, 0) < 0) {		perror("getpc: ptrace(PTRACE_GETREGS, ...)");		return -1;	}	return regs.r_pc;#endif /* SUNOS4 */#ifdef SVR4	/* XXX */	return 0;#endif /* SVR4 */#ifdef FREEBSD	struct reg regs;	pread(tcp->pfd_reg, &regs, sizeof(regs), 0);	return regs.r_eip;#endif /* FREEBSD */}voidprintcall(tcp)struct tcb *tcp;{#ifdef LINUX#ifdef I386	long eip;	if (upeek(tcp->pid, 4*EIP, &eip) < 0) {		tprintf("[????????] ");		return;	}	tprintf("[%08lx] ", eip);#elif defined(IA62)	long ip;	if (upeek(tcp->pid, PT_B0, &ip) < 0) {		tprintf("[????????] ");		return;	}	tprintf("[%08lx] ", ip);#elif defined(POWERPC)	long pc;	if (upeek(tcp->pid, 4*PT_NIP, &pc) < 0) {		tprintf ("[????????] ");		return;	}	tprintf("[%08lx] ", pc);#elif defined(M68k)	long pc;	if (upeek(tcp->pid, 4*PT_PC, &pc) < 0) {		tprintf ("[????????] ");		return;	}	tprintf("[%08lx] ", pc);#elif defined(ALPHA)	long pc;	if (upeek(tcp->pid, REG_PC, &pc) < 0) {		tprintf ("[????????] ");		return;	}	tprintf("[%08lx] ", pc);#elif defined(SPARC)	struct regs regs;	if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)&regs,0) < 0) {		tprintf("[????????] ");		return;	}	tprintf("[%08lx] ", regs.r_pc);#elif defined(HPPA)	long pc;	if(upeek(tcp->pid,PT_IAOQ0,&pc) < 0) {		tprintf ("[????????] ");		return;	}	tprintf("[%08lx] ", pc);#endif /* !architecture */#endif /* LINUX */#ifdef SUNOS4	struct regs regs;	if (ptrace(PTRACE_GETREGS, tcp->pid, (char *) &regs, 0) < 0) {		perror("printcall: ptrace(PTRACE_GETREGS, ...)");		tprintf("[????????] ");		return;	}	tprintf("[%08x] ", regs.r_o7);#endif /* SUNOS4 */#ifdef SVR4	/* XXX */	tprintf("[????????] ");#endif#ifdef FREEBSD	struct reg regs;	pread(tcp->pfd_reg, &regs, sizeof(regs), 0);	tprintf("[%08x] ", regs.r_eip);#endif /* FREEBSD */}

⌨️ 快捷键说明

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