blob: 9ef96c98fa18fa3125ea0f3ddc7b1c1714b16fe5 [file] [log] [blame]
Juan Cespedes5e01f651998-03-08 22:31:44 +01001#include <stdio.h>
Juan Cespedes1fe93d51998-03-13 00:29:21 +01002#include <string.h>
3#include <errno.h>
Juan Cespedes5e01f651998-03-08 22:31:44 +01004#include <sys/types.h>
5#include <sys/ptrace.h>
6#include <asm/unistd.h>
7
8#include "ltrace.h"
9#include "options.h"
10
Juan Cespedes81690ef1998-03-13 19:31:29 +010011/* Returns 1 if the sysnum may make a new child to be created
12 * (ie, with fork() or clone())
13 * Returns 0 otherwise.
14 */
15int fork_p(int sysnum)
Juan Cespedes5e01f651998-03-08 22:31:44 +010016{
17 return (sysnum == __NR_fork || sysnum == __NR_clone);
18}
19
Juan Cespedes81690ef1998-03-13 19:31:29 +010020/* Returns 1 if the sysnum may make the process exec other program
21 */
22int exec_p(int sysnum)
23{
24 return (sysnum == __NR_execve);
25}
26
Juan Cespedes5e01f651998-03-08 22:31:44 +010027void trace_me(void)
28{
29 if (ptrace(PTRACE_TRACEME, 0, 1, 0)<0) {
30 perror("PTRACE_TRACEME");
31 exit(1);
32 }
33}
34
Juan Cespedes273ea6d1998-03-14 23:02:40 +010035int trace_pid(pid_t pid)
Juan Cespedes1fe93d51998-03-13 00:29:21 +010036{
37 if (ptrace(PTRACE_ATTACH, pid, 1, 0) < 0) {
Juan Cespedes273ea6d1998-03-14 23:02:40 +010038 return -1;
Juan Cespedes1fe93d51998-03-13 00:29:21 +010039 }
Juan Cespedes273ea6d1998-03-14 23:02:40 +010040 return 0;
41}
42
43void untrace_pid(pid_t pid)
44{
45 ptrace(PTRACE_DETACH, pid, 1, 0);
Juan Cespedes1fe93d51998-03-13 00:29:21 +010046}
47
Juan Cespedes5e01f651998-03-08 22:31:44 +010048void continue_after_signal(pid_t pid, int signum)
49{
50 /* We should always trace syscalls to be able to control fork(), clone(), execve()... */
51#if 0
52 if (opt_S) {
53 ptrace(PTRACE_SYSCALL, pid, 1, signum);
54 } else {
55 ptrace(PTRACE_CONT, pid, 1, signum);
56 }
57#else
58 ptrace(PTRACE_SYSCALL, pid, 1, signum);
59#endif
60}
61
62void continue_process(pid_t pid)
63{
64 continue_after_signal(pid, 0);
65}
66
67void continue_enabling_breakpoint(pid_t pid, struct breakpoint * sbp)
68{
69 insert_breakpoint(pid, sbp);
70 continue_process(pid);
71}