diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-04-22 18:44:45 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-04-22 18:44:45 +0200 |
commit | 5c68929aa1724867eec6b65c0ae50dc8a8d4c589 (patch) | |
tree | ee997e95163743f7c92354f87f5fe722f31b1031 /Userland/strace.cpp | |
parent | 6693cfb26acf9d5b53d090be309956456f546239 (diff) | |
download | serenity-5c68929aa1724867eec6b65c0ae50dc8a8d4c589.zip |
Kernel: Add a systrace() syscall and implement /bin/strace using it.
Calling systrace(pid) gives you a file descriptor with a stream of the
syscalls made by a peer process. The process must be owned by the same
UID who calls systrace(). :^)
Diffstat (limited to 'Userland/strace.cpp')
-rw-r--r-- | Userland/strace.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Userland/strace.cpp b/Userland/strace.cpp new file mode 100644 index 0000000000..374ac1cf80 --- /dev/null +++ b/Userland/strace.cpp @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <AK/Assertions.h> +#include <AK/Types.h> +#include <Kernel/Syscall.h> + +int main(int argc, char** argv) +{ + if (argc < 2) + return 1; + + int pid = atoi(argv[1]); + int fd = systrace(pid); + if (fd < 0) { + perror("systrace"); + return 1; + } + + for (;;) { + dword call[5]; + int nread = read(fd, &call, sizeof(call)); + if (nread == 0) + break; + if (nread < 0) { + perror("read"); + return 1; + } + ASSERT(nread == sizeof(call)); + printf("%s(%#x, %#x, %#x) = %#x\n", Syscall::to_string((Syscall::Function)call[0]), call[1], call[2], call[3], call[4]); + } + + int rc = close(fd); + if (rc < 0) { + perror("close"); + return 1; + } + + return 0; +} |