ptrace()手册翻译

ptrace是一个Linux系统调用,允许一个进程(tracer)观察和控制另一个进程(tracee)的执行,包括读写内存和寄存器。tracer可以通过PTRACE_TRACEME请求跟踪子进程,当tracee因信号暂停时,tracer使用ptrace命令进行交互。示例代码展示了如何使用ptrace跟踪并识别子进程的系统调用。
摘要由CSDN通过智能技术生成
#include <sys/ptrace.h>

long ptrace(
            enum __ptrace_request request,
            pid_t pid,
            void *addr,
            void *data
            );

描述

ptrace()使得一个进程(tracer)能够观察、控制另一个进程(tracee)的执行,以及检测、改变tracee的内存、寄存器。

一个tracee首先需要被attach到一个tracer,Attachment
and subsequent commands are per thread: in a multithreaded
process, every thread can be individually attached to a
(potentially different) tracer, or left not attached and thus not
debugged. Therefore, “tracee” always means “(one) thread”, never
“a (possibly multithreaded) process”. Ptrace commands are always
sent to a specific tracee using a call of the form
ptrace(PTRACE_foo, pid, ...)

where pid is the thread ID of the corresponding Linux thread.

(Note that in this page, a “multithreaded process” means a thread
group consisting of threads created using the clone(2)
CLONE_THREAD flag.)

如果一个进程要发起一次跟踪,有两种方式:

  1. fork()一个子进程,然后让子进程调用ptrace(PTRACE_TRACEME, ...),这通常会和execve(2)结合使用,在execve()中调用我们实际要追踪的.
  2. 使用PTRACE_ATTACH或者PTRACE_SEIZE

当被跟踪时,tracee每发送一个信号就会停下,即使信号被忽略了(一个例外是SIGKILL,它和平常一样)。tracer在下一次调用waitpid(2)(或者是其他wait系列函数)时会被通知,该次调用会返回状态码以指示tracee停下的原因。当tracee停下的时候,tracer可以使用多种ptrace请求来观察、修改tracee。然后,tracer会让tracee继续运行,optionally ignoring the delivered signal (or even delivering a different signal instead).


If the PTRACE_O_TRACEEXEC option is not in effect,则被跟踪进程对 execve(2) 的所有成功调用都将导致向其发送 SIGTRAP 信号,从而使父进程有机会在新程序开始执行之前获得控制权。 当跟踪器完成跟踪后,它可以通过 PTRACE_DETACH 使被跟踪者继续以正常的、未跟踪的模式执行。


request的值决定了ptrace要执行的操作:

(这一部分实在太多,而且难懂,用到的就翻译一下,没用到的先搁置)

  • PTRACE_TRACEME
    • 表示这个进程被它的父进程跟踪。
    • 如果它的父进程不希望追踪它,那么该进程很可能不应该发起该request。
    • pid、addr、data被忽略。
  • PTRACE_PEEKTEXT,PTRACE_PEEKDATA
    • 从tracess的内存的地址addr处读取一个字,返回读取的字作为ptrace()的调用结果。
    • LInux没有单独的text和data地址空间,所以这两个目前是等效的。
    • data被忽略,但是请注意NOTES。
  • PTRACE_PEEKUSER
    • 从tracee的USER区域的addr偏移处读取一个字,USER区域包含了寄存器和其他信息(见<sys/user.h>)。
    • 返回读取的字。
    • 通常,偏移量应该是字对齐的,这个随架构变化,见NOTES。
    • data被忽略,但是请看看NOTES。
  • PTRACE_GETREGS, PTRACE_GETREGS
    • 复制tracee的通用寄存器和浮点寄存器到tracer的data地址处。
    • 查看<sys/user.h>以获取有关格式的信息。
    • addr被忽略。
    • 注意SPARC的data和addr是相反的。
    • 这两个不是在所有架构都提供有。
  • PTRACE_SETREGS, PTRACE_SETPREGS
    • 以tracer的data处的数据分别修改tracee的通用寄存器或者浮点寄存器。
    • 至于PTRACE_POKEUSER,一些通用寄存器的修改可能不被允许。
    • addr被忽略。
    • 注意SPARC的data和addr是相反的。
    • 这两个不是在所有架构都提供有。

附代码例子

一份来自github的代码,有助于理解ptrace的使用:
(原链接:https://gist.github.com/willb/14488

/*
  ptr_inspect.c

  Demonstration code; shows how to trace the system calls in a child
  process with ptrace.  Only works on 64-bit x86 Linux for now, I'm
  afraid.  (Even worse, it's only tested on Linux 2.6....)

  The callname() function looks clunky and machine-generated because it
  *is* clunky and machine-generated.

  I got inspiration and a starting point from this old LJ article:
    http://www.linuxjournal.com/article/6100

  I release this code to the public domain.  Share and enjoy.

  Will Benton
  Madison, 2008
*/

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/user.h>

#include <syscall.h>

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

const char *callname (long call);

#if __WORDSIZE == 64
	#define REG(reg) reg.orig_rax
#else
	#define REG(reg) reg.orig_eax
#endif

int main (int argc, char *argv[])
{
	pid_t child;
	
	if (argc == 1) {
		return 0;
	}
	
	char *chargs[argc];
	int i = 0;
	
	for (; i < argc - 1; ++i) {
		chargs[i] = argv[i + 1];
	}
	chargs[i] = NULL;
	
	
	child = fork();
	if (child == 0) {
	 ptrace (PTRACE_TRACEME, 0, NULL, NULL);
	 execvp (chargs[0], chargs);
	} else {
	 int status;
	
	 while (waitpid (child, &status, 0) && ! WIFEXITED (status)) {
	     struct user_regs_struct regs;
	     ptrace (PTRACE_GETREGS, child, NULL, &regs);
	     fprintf (stderr, "system call %s from pid %d\n", callname (REG (regs)), child);
	     ptrace (PTRACE_SYSCALL, child, NULL, NULL);
	 }
	}
	return 0;
}

/* callname */

static char *callname_buf[256];

const char *callname (long call)
{
	switch (call) {
	
#ifdef SYS__sysctl
		case SYS__sysctl :
			return "_sysctl";
#endif
			
#ifdef SYS_access
		case SYS_access :
			return "access";
#endif
			
#ifdef SYS_acct
		case SYS_acct :
			return "acct";
#endif
			
#ifdef SYS_add_key
		case SYS_add_key :
			return "add_key";
#endif
			
#ifdef SYS_adjtimex
		case SYS_adjtimex :
			return "adjtimex";
#endif
			
#ifdef SYS_afs_syscall
		case SYS_afs_syscall :
			return "afs_syscall";
#endif
			
#ifdef SYS_alarm
		case SYS_alarm :
			return "alarm";
#endif
			
#ifdef SYS_brk
		case SYS_brk :
			return "brk";
#endif
			
#ifdef SYS_capget
		case SYS_capget :
			return "capget";
#endif
			
#ifdef SYS_capset
		case SYS_capset :
			return "capset";
#endif
			
#ifdef SYS_chdir
		case SYS_chdir :
			return "chdir";
#endif
			
#ifdef SYS_chmod
		case SYS_chmod :
			return "chmod";
#endif
			
#ifdef SYS_chown
		case SYS_chown :
			return "chown";
#endif
			
#ifdef SYS_chroot
		case SYS_chroot :
			return "chroot";
#endif
			
#ifdef SYS_clock_getres
		case SYS_clock_getres :
			return "clock_getres";
#endif
			
#ifdef SYS_clock_gettime
		case SYS_clock_gettime :
			return "clock_gettime";
#endif
			
#ifdef SYS_clock_nanosleep
		case SYS_clock_nanosleep :
			return "clock_nanosleep";
#endif
			
#ifdef SYS_clock_settime
		case SYS_clock_settime :
			return "clock_settime";
#endif
			
#ifdef SYS_clone
		case SYS_clone :
			return "clone";
#endif
			
#ifdef SYS_close
		case SYS_close :
			return "close";
#endif
			
#ifdef SYS_creat
		case SYS_creat :
			return "creat";
#endif
			
#ifdef SYS_create_module
		case SYS_create_module :
			return "create_module";
#endif
			
#ifdef SYS_delete_module
		case SYS_delete_module :
			return "delete_module";
#endif
			
#ifdef SYS_dup
		case SYS_dup :
			return "dup";
#endif
			
#ifdef SYS_dup2
		case SYS_dup2 :
			return "dup2";
#endif
			
#ifdef SYS_epoll_create
		case SYS_epoll_create :
			return "epoll_create";
#endif
			
#ifdef SYS_epoll_ctl
		case SYS_epoll_ctl :
			return "epoll_ctl";
#endif
			
#ifdef SYS_epoll_pwait
		case SYS_epoll_pwait :
			return "epoll_pwait";
#endif
			
#ifdef SYS_epoll_wait
		case SYS_epoll_wait :
			return "epoll_wait";
#endif
			
#ifdef SYS_eventfd
		case SYS_eventfd :
			return "eventfd";
#endif
			
#ifdef SYS_execve
		case SYS_execve :
			return "execve";
#endif
			
#ifdef SYS_exit
		case SYS_exit :
			return "exit";
#endif
			
#ifdef SYS_exit_group
		case SYS_exit_group :
			return "exit_group";
#endif
			
#ifdef SYS_faccessat
		case SYS_faccessat :
			return "faccessat";
#endif
			
#ifdef SYS_fadvise64
		case SYS_fadvise64 :
			return "fadvise64";
#endif
			
#ifdef SYS_fallocate
		case SYS_fallocate :
			return "fallocate";
#endif
			
#ifdef SYS_fchdir
		case SYS_fchdir :
			return "fchdir";
#endif
			
#ifdef SYS_fchmod
		case SYS_fchmod :
			return "fchmod";
#endif
			
#ifdef SYS_fchmodat
		case SYS_fchmodat :
			return "fchmodat";
#endif
			
#ifdef SYS_fchown
		case SYS_fchown :
			return "fchown";
#endif
			
#ifdef SYS_fchownat
		case SYS_fchownat :
			return "fchownat";
#endif
			
#ifdef SYS_fcntl
		case SYS_fcntl :
			return "fcntl";
#endif
			
#ifdef SYS_fdatasync
		case SYS_fdatasync :
			return "fdatasync";
#endif
			
#ifdef SYS_fgetxattr
		case SYS_fgetxattr :
			return "fgetxattr";
#endif
			
#ifdef SYS_flistxattr
		case SYS_flistxattr :
			return "flistxattr";
#endif
			
#ifdef SYS_flock
		case SYS_flock :
			return "flock";
#endif
			
#ifdef SYS_fork
		case SYS_fork :
			return "fork";
#endif
			
#ifdef SYS_fremovexattr
		case SYS_fremovexattr :
			return "fremovexattr";
#endif
			
#ifdef SYS_fsetxattr
		case SYS_fsetxattr :
			return "fsetxattr";
#endif
			
#ifdef SYS_fstat
		case SYS_fstat :
			return "fstat";
#endif
			
#ifdef SYS_fstatfs
		case SYS_fstatfs :
			return "fstatfs";
#endif
			
#ifdef SYS_fsync
		case SYS_fsync :
			return "fsync";
#endif
			
#ifdef SYS_ftruncate
		case SYS_ftruncate :
			return "ftruncate";
#endif
			
#ifdef SYS_futex
		case SYS_futex :
			return "futex";
#endif
			
#ifdef SYS_futimesat
		case SYS_futimesat :
			return "futimesat";
#endif
			
#ifdef SYS_get_kernel_syms
		case SYS_get_kernel_syms :
			return "get_kernel_syms";
#endif
			
#ifdef SYS_get_mempolicy
		case SYS_get_mempolicy :
			return "get_mempolicy";
#endif
			
#ifdef SYS_get_robust_list
		case SYS_get_robust_list :
			return "get_robust_list";
#endif
			
#ifdef SYS_get_thread_area
		case SYS_get_thread_area :
			return "get_thread_area";
#endif
			
#ifdef SYS_getcwd
		case SYS_getcwd :
			return "getcwd";
#endif
			
#ifdef SYS_getdents
		case SYS_getdents :
			return "getdents";
#endif
			
#ifdef SYS_getdents64
		case SYS_getdents64 :
			return "getdents64";
#endif
			
#ifdef SYS_getegid
		case SYS_getegid :
			return "getegid";
#endif
			
#ifdef SYS_geteuid
		case SYS_geteuid :
			return "geteuid";
#endif
			
#ifdef SYS_getgid
		case SYS_getgid :
			return "getgid";
#endif
			
#ifdef SYS_getgroups
		case SYS_getgroups :
			return "getgroups";
#endif
			
#ifdef SYS_getitimer
		case SYS_getitimer :
			return "getitimer";
#endif
			
#ifdef SYS_getpgid
		case SYS_getpgid :
			return "getpgid";
#endif
			
#ifdef SYS_getpgrp
		case SYS_getpgrp :
			return "getpgrp";
#endif
			
#ifdef SYS_getpid
		case SYS_getpid :
			return "getpid";
#endif
			
#ifdef SYS_getpmsg
		case SYS_getpmsg :
			return "getpmsg";
#endif
			
#ifdef SYS_getppid
		case SYS_getppid :
			return "getppid";
#endif
			
#ifdef SYS_getpriority
		case SYS_getpriority :
			return "getpriority";
#endif
			
#ifdef SYS_getresgid
		case SYS_getresgid :
			return "getresgid";
#endif
			
#ifdef SYS_getresuid
		case SYS_getresuid :
			return "getresuid";
#endif
			
#ifdef SYS_getrlimit
		case SYS_getrlimit :
			return "getrlimit";
#endif
			
#ifdef SYS_getrusage
		case SYS_getrusage :
			return "getrusage";
#endif
			
#ifdef SYS_getsid
		case SYS_getsid :
			return "getsid";
#endif
			
#ifdef SYS_gettid
		case SYS_gettid :
			return "gettid";
#endif
			
#ifdef SYS_gettimeofday
		case SYS_gettimeofday :
			return "gettimeofday";
#endif
			
#ifdef SYS_getuid
		case SYS_getuid :
			return "getuid";
#endif
			
#ifdef SYS_getxattr
		case SYS_getxattr :
			return "getxattr";
#endif
			
#ifdef SYS_init_module
		case SYS_init_module :
			return "init_module";
#endif
			
#ifdef SYS_inotify_add_watch
		case SYS_inotify_add_watch :
			return "inotify_add_watch";
#endif
			
#ifdef SYS_inotify_init
		case SYS_inotify_init :
			return "inotify_init";
#endif
			
#ifdef SYS_inotify_rm_watch
		case SYS_inotify_rm_watch :
			return "inotify_rm_watch";
#endif
			
#ifdef SYS_io_cancel
		case SYS_io_cancel :
			return "io_cancel";
#endif
			
#ifdef SYS_io_destroy
		case SYS_io_destroy :
			return "io_destroy";
#endif
			
#ifdef SYS_io_getevents
		case SYS_io_getevents :
			return "io_getevents";
#endif
			
#ifdef SYS_io_setup
		case SYS_io_setup :
			return "io_setup";
#endif
			
#ifdef SYS_io_submit
		case SYS_io_submit :
			return "io_submit";
#endif
			
#ifdef SYS_ioctl
		case SYS_ioctl :
			return "ioctl";
#endif
			
#ifdef SYS_ioperm
		case SYS_ioperm :
			return "ioperm";
#endif
			
#ifdef SYS_iopl
		case SYS_iopl :
			return "iopl";
#endif
			
#ifdef SYS_ioprio_get
		case SYS_ioprio_get :
			return "ioprio_get";
#endif
			
#ifdef SYS_ioprio_set
		case SYS_ioprio_set :
			return "ioprio_set";
#endif
			
#ifdef SYS_kexec_load
		case SYS_kexec_load :
			return "kexec_load";
#endif
			
#ifdef SYS_keyctl
		case SYS_keyctl :
			return "keyctl";
#endif
			
#ifdef SYS_kill
		case SYS_kill :
			return "kill";
#endif
			
#ifdef SYS_lchown
		case SYS_lchown :
			return "lchown";
#endif
			
#ifdef SYS_lgetxattr
		case SYS_lgetxattr :
			return "lgetxattr";
#endif
			
#ifdef SYS_link
		case SYS_link :
			return "link";
#endif
			
#ifdef SYS_linkat
		case SYS_linkat :
			return "linkat";
#endif
			
#ifdef SYS_listxattr
		case SYS_listxattr :
			return "listxattr";
#endif
			
#ifdef SYS_llistxattr
		case SYS_llistxattr :
			return "llistxattr";
#endif
			
#ifdef SYS_lookup_dcookie
		case SYS_lookup_dcookie :
			return "lookup_dcookie";
#endif
			
#ifdef SYS_lremovexattr
		case SYS_lremovexattr :
			return "lremovexattr";
#endif
			
#ifdef SYS_lseek
		case SYS_lseek :
			return "lseek";
#endif
			
#ifdef SYS_lsetxattr
		case SYS_lsetxattr :
			return "lsetxattr";
#endif
			
#ifdef SYS_lstat
		case SYS_lstat :
			return "lstat";
#endif
			
#ifdef SYS_madvise
		case SYS_madvise :
			return "madvise";
#endif
			
#ifdef SYS_mbind
		case SYS_mbind :
			return "mbind";
#endif
			
#ifdef SYS_migrate_pages
		case SYS_migrate_pages :
			return "migrate_pages";
#endif
			
#ifdef SYS_mincore
		case SYS_mincore :
			return "mincore";
#endif
			
#ifdef SYS_mkdir
		case SYS_mkdir :
			return "mkdir";
#endif
			
#ifdef SYS_mkdirat
		case SYS_mkdirat :
			return "mkdirat";
#endif
			
#ifdef SYS_mknod
		case SYS_mknod :
			return "mknod";
#endif
			
#ifdef SYS_mknodat
		case SYS_mknodat :
			return "mknodat";
#endif
			
#ifdef SYS_mlock
		case SYS_mlock :
			return "mlock";
#endif
			
#ifdef SYS_mlockall
		case SYS_mlockall :
			return "mlockall";
#endif
			
#ifdef SYS_mmap
		case SYS_mmap :
			return "mmap";
#endif
			
#ifdef SYS_modify_ldt
		case SYS_modify_ldt :
			return "modify_ldt";
#endif
			
#ifdef SYS_mount
		case SYS_mount :
			return "mount";
#endif
			
#ifdef SYS_move_pages
		case SYS_move_pages :
			return "move_pages";
#endif
			
#ifdef SYS_mprotect
		case SYS_mprotect :
			return "mprotect";
#endif
			
#ifdef SYS_mq_getsetattr
		case SYS_mq_getsetattr :
			return "mq_getsetattr";
#endif
			
#ifdef SYS_mq_notify
		case SYS_mq_notify :
			return "mq_notify";
#endif
			
#ifdef SYS_mq_open
		case SYS_mq_open :
			return "mq_open";
#endif
			
#ifdef SYS_mq_timedreceive
		case SYS_mq_timedreceive :
			return "mq_timedreceive";
#endif
			
#ifdef SYS_mq_timedsend
		case SYS_mq_timedsend :
			return "mq_timedsend";
#endif
			
#ifdef SYS_mq_unlink
		case SYS_mq_unlink :
			return "mq_unlink";
#endif
			
#ifdef SYS_mremap
		case SYS_mremap :
			return "mremap";
#endif
			
#ifdef SYS_msync
		case SYS_msync :
			return "msync";
#endif
			
#ifdef SYS_munlock
		case SYS_munlock :
			return "munlock";
#endif
			
#ifdef SYS_munlockall
		case SYS_munlockall :
			return "munlockall";
#endif
			
#ifdef SYS_munmap
		case SYS_munmap :
			return "munmap";
#endif
			
#ifdef SYS_nanosleep
		case SYS_nanosleep :
			return "nanosleep";
#endif
			
#ifdef SYS_nfsservctl
		case SYS_nfsservctl :
			return "nfsservctl";
#endif
			
#ifdef SYS_open
		case SYS_open :
			return "open";
#endif
			
#ifdef SYS_openat
		case SYS_openat :
			return "openat";
#endif
			
#ifdef SYS_pause
		case SYS_pause :
			return "pause";
#endif
			
#ifdef SYS_personality
		case SYS_personality :
			return "personality";
#endif
			
#ifdef SYS_pipe
		case SYS_pipe :
			return "pipe";
#endif
			
#ifdef SYS_pivot_root
		case SYS_pivot_root :
			return "pivot_root";
#endif
			
#ifdef SYS_poll
		case SYS_poll :
			return "poll";
#endif
			
#ifdef SYS_ppoll
		case SYS_ppoll :
			return "ppoll";
#endif
			
#ifdef SYS_prctl
		case SYS_prctl :
			return "prctl";
#endif
			
#ifdef SYS_pread64
		case SYS_pread64 :
			return "pread64";
#endif
			
#ifdef SYS_pselect6
		case SYS_pselect6 :
			return "pselect6";
#endif
			
#ifdef SYS_ptrace
		case SYS_ptrace :
			return "ptrace";
#endif
			
#ifdef SYS_putpmsg
		case SYS_putpmsg :
			return "putpmsg";
#endif
			
#ifdef SYS_pwrite64
		case SYS_pwrite64 :
			return "pwrite64";
#endif
			
#ifdef SYS_query_module
		case SYS_query_module :
			return "query_module";
#endif
			
#ifdef SYS_quotactl
		case SYS_quotactl :
			return "quotactl";
#endif
			
#ifdef SYS_read
		case SYS_read :
			return "read";
#endif
			
#ifdef SYS_readahead
		case SYS_readahead :
			return "readahead";
#endif
			
#ifdef SYS_readlink
		case SYS_readlink :
			return "readlink";
#endif
			
#ifdef SYS_readlinkat
		case SYS_readlinkat :
			return "readlinkat";
#endif
			
#ifdef SYS_readv
		case SYS_readv :
			return "readv";
#endif
			
#ifdef SYS_reboot
		case SYS_reboot :
			return "reboot";
#endif
			
#ifdef SYS_remap_file_pages
		case SYS_remap_file_pages :
			return "remap_file_pages";
#endif
			
#ifdef SYS_removexattr
		case SYS_removexattr :
			return "removexattr";
#endif
			
#ifdef SYS_rename
		case SYS_rename :
			return "rename";
#endif
			
#ifdef SYS_renameat
		case SYS_renameat :
			return "renameat";
#endif
			
#ifdef SYS_request_key
		case SYS_request_key :
			return "request_key";
#endif
			
#ifdef SYS_restart_syscall
		case SYS_restart_syscall :
			return "restart_syscall";
#endif
			
#ifdef SYS_rmdir
		case SYS_rmdir :
			return "rmdir";
#endif
			
#ifdef SYS_rt_sigaction
		case SYS_rt_sigaction :
			return "rt_sigaction";
#endif
			
#ifdef SYS_rt_sigpending
		case SYS_rt_sigpending :
			return "rt_sigpending";
#endif
			
#ifdef SYS_rt_sigprocmask
		case SYS_rt_sigprocmask :
			return "rt_sigprocmask";
#endif
			
#ifdef SYS_rt_sigqueueinfo
		case SYS_rt_sigqueueinfo :
			return "rt_sigqueueinfo";
#endif
			
#ifdef SYS_rt_sigreturn
		case SYS_rt_sigreturn :
			return "rt_sigreturn";
#endif
			
#ifdef SYS_rt_sigsuspend
		case SYS_rt_sigsuspend :
			return "rt_sigsuspend";
#endif
			
#ifdef SYS_rt_sigtimedwait
		case SYS_rt_sigtimedwait :
			return "rt_sigtimedwait";
#endif
			
#ifdef SYS_sched_get_priority_max
		case SYS_sched_get_priority_max :
			return "sched_get_priority_max";
#endif
			
#ifdef SYS_sched_get_priority_min
		case SYS_sched_get_priority_min :
			return "sched_get_priority_min";
#endif
			
#ifdef SYS_sched_getaffinity
		case SYS_sched_getaffinity :
			return "sched_getaffinity";
#endif
			
#ifdef SYS_sched_getparam
		case SYS_sched_getparam :
			return "sched_getparam";
#endif
			
#ifdef SYS_sched_getscheduler
		case SYS_sched_getscheduler :
			return "sched_getscheduler";
#endif
			
#ifdef SYS_sched_rr_get_interval
		case SYS_sched_rr_get_interval :
			return "sched_rr_get_interval";
#endif
			
#ifdef SYS_sched_setaffinity
		case SYS_sched_setaffinity :
			return "sched_setaffinity";
#endif
			
#ifdef SYS_sched_setparam
		case SYS_sched_setparam :
			return "sched_setparam";
#endif
			
#ifdef SYS_sched_setscheduler
		case SYS_sched_setscheduler :
			return "sched_setscheduler";
#endif
			
#ifdef SYS_sched_yield
		case SYS_sched_yield :
			return "sched_yield";
#endif
			
#ifdef SYS_select
		case SYS_select :
			return "select";
#endif
			
#ifdef SYS_sendfile
		case SYS_sendfile :
			return "sendfile";
#endif
			
#ifdef SYS_set_mempolicy
		case SYS_set_mempolicy :
			return "set_mempolicy";
#endif
			
#ifdef SYS_set_robust_list
		case SYS_set_robust_list :
			return "set_robust_list";
#endif
			
#ifdef SYS_set_thread_area
		case SYS_set_thread_area :
			return "set_thread_area";
#endif
			
#ifdef SYS_set_tid_address
		case SYS_set_tid_address :
			return "set_tid_address";
#endif
			
#ifdef SYS_setdomainname
		case SYS_setdomainname :
			return "setdomainname";
#endif
			
#ifdef SYS_setfsgid
		case SYS_setfsgid :
			return "setfsgid";
#endif
			
#ifdef SYS_setfsuid
		case SYS_setfsuid :
			return "setfsuid";
#endif
			
#ifdef SYS_setgid
		case SYS_setgid :
			return "setgid";
#endif
			
#ifdef SYS_setgroups
		case SYS_setgroups :
			return "setgroups";
#endif
			
#ifdef SYS_sethostname
		case SYS_sethostname :
			return "sethostname";
#endif
			
#ifdef SYS_setitimer
		case SYS_setitimer :
			return "setitimer";
#endif
			
#ifdef SYS_setpgid
		case SYS_setpgid :
			return "setpgid";
#endif
			
#ifdef SYS_setpriority
		case SYS_setpriority :
			return "setpriority";
#endif
			
#ifdef SYS_setregid
		case SYS_setregid :
			return "setregid";
#endif
			
#ifdef SYS_setresgid
		case SYS_setresgid :
			return "setresgid";
#endif
			
#ifdef SYS_setresuid
		case SYS_setresuid :
			return "setresuid";
#endif
			
#ifdef SYS_setreuid
		case SYS_setreuid :
			return "setreuid";
#endif
			
#ifdef SYS_setrlimit
		case SYS_setrlimit :
			return "setrlimit";
#endif
			
#ifdef SYS_setsid
		case SYS_setsid :
			return "setsid";
#endif
			
#ifdef SYS_settimeofday
		case SYS_settimeofday :
			return "settimeofday";
#endif
			
#ifdef SYS_setuid
		case SYS_setuid :
			return "setuid";
#endif
			
#ifdef SYS_setxattr
		case SYS_setxattr :
			return "setxattr";
#endif
			
#ifdef SYS_sigaltstack
		case SYS_sigaltstack :
			return "sigaltstack";
#endif
			
#ifdef SYS_signalfd
		case SYS_signalfd :
			return "signalfd";
#endif
			
#ifdef SYS_splice
		case SYS_splice :
			return "splice";
#endif
			
#ifdef SYS_stat
		case SYS_stat :
			return "stat";
#endif
			
#ifdef SYS_statfs
		case SYS_statfs :
			return "statfs";
#endif
			
#ifdef SYS_swapoff
		case SYS_swapoff :
			return "swapoff";
#endif
			
#ifdef SYS_swapon
		case SYS_swapon :
			return "swapon";
#endif
			
#ifdef SYS_symlink
		case SYS_symlink :
			return "symlink";
#endif
			
#ifdef SYS_symlinkat
		case SYS_symlinkat :
			return "symlinkat";
#endif
			
#ifdef SYS_sync
		case SYS_sync :
			return "sync";
#endif
			
#ifdef SYS_sync_file_range
		case SYS_sync_file_range :
			return "sync_file_range";
#endif
			
#ifdef SYS_sysfs
		case SYS_sysfs :
			return "sysfs";
#endif
			
#ifdef SYS_sysinfo
		case SYS_sysinfo :
			return "sysinfo";
#endif
			
#ifdef SYS_syslog
		case SYS_syslog :
			return "syslog";
#endif
			
#ifdef SYS_tee
		case SYS_tee :
			return "tee";
#endif
			
#ifdef SYS_tgkill
		case SYS_tgkill :
			return "tgkill";
#endif
			
#ifdef SYS_time
		case SYS_time :
			return "time";
#endif
			
#ifdef SYS_timer_create
		case SYS_timer_create :
			return "timer_create";
#endif
			
#ifdef SYS_timer_delete
		case SYS_timer_delete :
			return "timer_delete";
#endif
			
#ifdef SYS_timer_getoverrun
		case SYS_timer_getoverrun :
			return "timer_getoverrun";
#endif
			
#ifdef SYS_timer_gettime
		case SYS_timer_gettime :
			return "timer_gettime";
#endif
			
#ifdef SYS_timer_settime
		case SYS_timer_settime :
			return "timer_settime";
#endif
			
#ifdef SYS_timerfd_create
		case SYS_timerfd_create :
			return "timerfd_create";
#endif
			
#ifdef SYS_timerfd_gettime
		case SYS_timerfd_gettime :
			return "timerfd_gettime";
#endif
			
#ifdef SYS_timerfd_settime
		case SYS_timerfd_settime :
			return "timerfd_settime";
#endif
			
#ifdef SYS_times
		case SYS_times :
			return "times";
#endif
			
#ifdef SYS_tkill
		case SYS_tkill :
			return "tkill";
#endif
			
#ifdef SYS_truncate
		case SYS_truncate :
			return "truncate";
#endif
			
#ifdef SYS_umask
		case SYS_umask :
			return "umask";
#endif
			
#ifdef SYS_umount2
		case SYS_umount2 :
			return "umount2";
#endif
			
#ifdef SYS_uname
		case SYS_uname :
			return "uname";
#endif
			
#ifdef SYS_unlink
		case SYS_unlink :
			return "unlink";
#endif
			
#ifdef SYS_unlinkat
		case SYS_unlinkat :
			return "unlinkat";
#endif
			
#ifdef SYS_unshare
		case SYS_unshare :
			return "unshare";
#endif
			
#ifdef SYS_uselib
		case SYS_uselib :
			return "uselib";
#endif
			
#ifdef SYS_ustat
		case SYS_ustat :
			return "ustat";
#endif
			
#ifdef SYS_utime
		case SYS_utime :
			return "utime";
#endif
			
#ifdef SYS_utimensat
		case SYS_utimensat :
			return "utimensat";
#endif
			
#ifdef SYS_utimes
		case SYS_utimes :
			return "utimes";
#endif
			
#ifdef SYS_vfork
		case SYS_vfork :
			return "vfork";
#endif
			
#ifdef SYS_vhangup
		case SYS_vhangup :
			return "vhangup";
#endif
			
#ifdef SYS_vmsplice
		case SYS_vmsplice :
			return "vmsplice";
#endif
			
#ifdef SYS_vserver
		case SYS_vserver :
			return "vserver";
#endif
			
#ifdef SYS_wait4
		case SYS_wait4 :
			return "wait4";
#endif
			
#ifdef SYS_waitid
		case SYS_waitid :
			return "waitid";
#endif
			
#ifdef SYS_write
		case SYS_write :
			return "write";
#endif
			
#ifdef SYS_writev
		case SYS_writev :
			return "writev";
#endif
			
#ifdef SYS_accept
		case SYS_accept :
			return "accept";
#endif
			
#ifdef SYS_arch_prctl
		case SYS_arch_prctl :
			return "arch_prctl";
#endif
			
#ifdef SYS_bind
		case SYS_bind :
			return "bind";
#endif
			
#ifdef SYS_connect
		case SYS_connect :
			return "connect";
#endif
			
#ifdef SYS_epoll_ctl_old
		case SYS_epoll_ctl_old :
			return "epoll_ctl_old";
#endif
			
#ifdef SYS_epoll_wait_old
		case SYS_epoll_wait_old :
			return "epoll_wait_old";
#endif
			
#ifdef SYS_getpeername
		case SYS_getpeername :
			return "getpeername";
#endif
			
#ifdef SYS_getsockname
		case SYS_getsockname :
			return "getsockname";
#endif
			
#ifdef SYS_getsockopt
		case SYS_getsockopt :
			return "getsockopt";
#endif
			
#ifdef SYS_listen
		case SYS_listen :
			return "listen";
#endif
			
#ifdef SYS_msgctl
		case SYS_msgctl :
			return "msgctl";
#endif
			
#ifdef SYS_msgget
		case SYS_msgget :
			return "msgget";
#endif
			
#ifdef SYS_msgrcv
		case SYS_msgrcv :
			return "msgrcv";
#endif
			
#ifdef SYS_msgsnd
		case SYS_msgsnd :
			return "msgsnd";
#endif
			
#ifdef SYS_newfstatat
		case SYS_newfstatat :
			return "newfstatat";
#endif
			
#ifdef SYS_recvfrom
		case SYS_recvfrom :
			return "recvfrom";
#endif
			
#ifdef SYS_recvmsg
		case SYS_recvmsg :
			return "recvmsg";
#endif
			
#ifdef SYS_security
		case SYS_security :
			return "security";
#endif
			
#ifdef SYS_semctl
		case SYS_semctl :
			return "semctl";
#endif
			
#ifdef SYS_semget
		case SYS_semget :
			return "semget";
#endif
			
#ifdef SYS_semop
		case SYS_semop :
			return "semop";
#endif
			
#ifdef SYS_semtimedop
		case SYS_semtimedop :
			return "semtimedop";
#endif
			
#ifdef SYS_sendmsg
		case SYS_sendmsg :
			return "sendmsg";
#endif
			
#ifdef SYS_sendto
		case SYS_sendto :
			return "sendto";
#endif
			
#ifdef SYS_setsockopt
		case SYS_setsockopt :
			return "setsockopt";
#endif
			
#ifdef SYS_shmat
		case SYS_shmat :
			return "shmat";
#endif
			
#ifdef SYS_shmctl
		case SYS_shmctl :
			return "shmctl";
#endif
			
#ifdef SYS_shmdt
		case SYS_shmdt :
			return "shmdt";
#endif
			
#ifdef SYS_shmget
		case SYS_shmget :
			return "shmget";
#endif
			
#ifdef SYS_shutdown
		case SYS_shutdown :
			return "shutdown";
#endif
			
#ifdef SYS_socket
		case SYS_socket :
			return "socket";
#endif
			
#ifdef SYS_socketpair
		case SYS_socketpair :
			return "socketpair";
#endif
			
#ifdef SYS_tuxcall
		case SYS_tuxcall :
			return "tuxcall";
#endif
			
#ifdef SYS__llseek
		case SYS__llseek :
			return "_llseek";
#endif
			
#ifdef SYS__newselect
		case SYS__newselect :
			return "_newselect";
#endif
			
#ifdef SYS_bdflush
		case SYS_bdflush :
			return "bdflush";
#endif
			
#ifdef SYS_break
		case SYS_break :
			return "break";
#endif
			
#ifdef SYS_chown32
		case SYS_chown32 :
			return "chown32";
#endif
			
#ifdef SYS_fadvise64_64
		case SYS_fadvise64_64 :
			return "fadvise64_64";
#endif
			
#ifdef SYS_fchown32
		case SYS_fchown32 :
			return "fchown32";
#endif
			
#ifdef SYS_fcntl64
		case SYS_fcntl64 :
			return "fcntl64";
#endif
			
#ifdef SYS_fstat64
		case SYS_fstat64 :
			return "fstat64";
#endif
			
#ifdef SYS_fstatat64
		case SYS_fstatat64 :
			return "fstatat64";
#endif
			
#ifdef SYS_fstatfs64
		case SYS_fstatfs64 :
			return "fstatfs64";
#endif
			
#ifdef SYS_ftime
		case SYS_ftime :
			return "ftime";
#endif
			
#ifdef SYS_ftruncate64
		case SYS_ftruncate64 :
			return "ftruncate64";
#endif
			
#ifdef SYS_getcpu
		case SYS_getcpu :
			return "getcpu";
#endif
			
#ifdef SYS_getegid32
		case SYS_getegid32 :
			return "getegid32";
#endif
			
#ifdef SYS_geteuid32
		case SYS_geteuid32 :
			return "geteuid32";
#endif
			
#ifdef SYS_getgid32
		case SYS_getgid32 :
			return "getgid32";
#endif
			
#ifdef SYS_getgroups32
		case SYS_getgroups32 :
			return "getgroups32";
#endif
			
#ifdef SYS_getresgid32
		case SYS_getresgid32 :
			return "getresgid32";
#endif
			
#ifdef SYS_getresuid32
		case SYS_getresuid32 :
			return "getresuid32";
#endif
			
#ifdef SYS_getuid32
		case SYS_getuid32 :
			return "getuid32";
#endif
			
#ifdef SYS_gtty
		case SYS_gtty :
			return "gtty";
#endif
			
#ifdef SYS_idle
		case SYS_idle :
			return "idle";
#endif
			
#ifdef SYS_ipc
		case SYS_ipc :
			return "ipc";
#endif
			
#ifdef SYS_lchown32
		case SYS_lchown32 :
			return "lchown32";
#endif
			
#ifdef SYS_lock
		case SYS_lock :
			return "lock";
#endif
			
#ifdef SYS_lstat64
		case SYS_lstat64 :
			return "lstat64";
#endif
			
#ifdef SYS_madvise1
		case SYS_madvise1 :
			return "madvise1";
#endif
			
#ifdef SYS_mmap2
		case SYS_mmap2 :
			return "mmap2";
#endif
			
#ifdef SYS_mpx
		case SYS_mpx :
			return "mpx";
#endif
			
#ifdef SYS_nice
		case SYS_nice :
			return "nice";
#endif
			
#ifdef SYS_oldfstat
		case SYS_oldfstat :
			return "oldfstat";
#endif
			
#ifdef SYS_oldlstat
		case SYS_oldlstat :
			return "oldlstat";
#endif
			
#ifdef SYS_oldolduname
		case SYS_oldolduname :
			return "oldolduname";
#endif
			
#ifdef SYS_oldstat
		case SYS_oldstat :
			return "oldstat";
#endif
			
#ifdef SYS_olduname
		case SYS_olduname :
			return "olduname";
#endif
			
#ifdef SYS_prof
		case SYS_prof :
			return "prof";
#endif
			
#ifdef SYS_profil
		case SYS_profil :
			return "profil";
#endif
			
#ifdef SYS_readdir
		case SYS_readdir :
			return "readdir";
#endif
			
#ifdef SYS_sendfile64
		case SYS_sendfile64 :
			return "sendfile64";
#endif
			
#ifdef SYS_setfsgid32
		case SYS_setfsgid32 :
			return "setfsgid32";
#endif
			
#ifdef SYS_setfsuid32
		case SYS_setfsuid32 :
			return "setfsuid32";
#endif
			
#ifdef SYS_setgid32
		case SYS_setgid32 :
			return "setgid32";
#endif
			
#ifdef SYS_setgroups32
		case SYS_setgroups32 :
			return "setgroups32";
#endif
			
#ifdef SYS_setregid32
		case SYS_setregid32 :
			return "setregid32";
#endif
			
#ifdef SYS_setresgid32
		case SYS_setresgid32 :
			return "setresgid32";
#endif
			
#ifdef SYS_setresuid32
		case SYS_setresuid32 :
			return "setresuid32";
#endif
			
#ifdef SYS_setreuid32
		case SYS_setreuid32 :
			return "setreuid32";
#endif
			
#ifdef SYS_setuid32
		case SYS_setuid32 :
			return "setuid32";
#endif
			
#ifdef SYS_sgetmask
		case SYS_sgetmask :
			return "sgetmask";
#endif
			
#ifdef SYS_sigaction
		case SYS_sigaction :
			return "sigaction";
#endif
			
#ifdef SYS_signal
		case SYS_signal :
			return "signal";
#endif
			
#ifdef SYS_sigpending
		case SYS_sigpending :
			return "sigpending";
#endif
			
#ifdef SYS_sigprocmask
		case SYS_sigprocmask :
			return "sigprocmask";
#endif
			
#ifdef SYS_sigreturn
		case SYS_sigreturn :
			return "sigreturn";
#endif
			
#ifdef SYS_sigsuspend
		case SYS_sigsuspend :
			return "sigsuspend";
#endif
			
#ifdef SYS_socketcall
		case SYS_socketcall :
			return "socketcall";
#endif
			
#ifdef SYS_ssetmask
		case SYS_ssetmask :
			return "ssetmask";
#endif
			
#ifdef SYS_stat64
		case SYS_stat64 :
			return "stat64";
#endif
			
#ifdef SYS_statfs64
		case SYS_statfs64 :
			return "statfs64";
#endif
			
#ifdef SYS_stime
		case SYS_stime :
			return "stime";
#endif
			
#ifdef SYS_stty
		case SYS_stty :
			return "stty";
#endif
			
#ifdef SYS_truncate64
		case SYS_truncate64 :
			return "truncate64";
#endif
			
#ifdef SYS_ugetrlimit
		case SYS_ugetrlimit :
			return "ugetrlimit";
#endif
			
#ifdef SYS_ulimit
		case SYS_ulimit :
			return "ulimit";
#endif
			
#ifdef SYS_umount
		case SYS_umount :
			return "umount";
#endif
			
#ifdef SYS_vm86
		case SYS_vm86 :
			return "vm86";
#endif
			
#ifdef SYS_vm86old
		case SYS_vm86old :
			return "vm86old";
#endif
			
#ifdef SYS_waitpid
		case SYS_waitpid :
			return "waitpid";
#endif
			
		default:
			return "unknown";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

barbyQAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值