Lines Matching refs:Event
47 static void handle_signal(Event *event);
48 static void handle_exit(Event *event);
49 static void handle_exit_signal(Event *event);
50 static void handle_syscall(Event *event);
51 static void handle_arch_syscall(Event *event);
52 static void handle_sysret(Event *event);
53 static void handle_arch_sysret(Event *event);
54 static void handle_clone(Event *event);
55 static void handle_exec(Event *event);
56 static void handle_breakpoint(Event *event);
57 static void handle_new(Event *event);
70 static Event *
71 call_handler(struct process *proc, Event *event)
77 return event;
79 return (*handler->on_event) (handler, event);
83 handle_event(Event *event)
91 event->proc ? event->proc->pid : -1, event->type);
94 overriding event handler, give them a chance to kick in.
96 doesn't sink the event. */
97 if (event->proc != NULL) {
98 event = call_handler(event->proc, event);
99 if (event == NULL)
104 * the event. */
105 if (event->proc != NULL
106 && event->proc->leader != NULL
107 && event->proc != event->proc->leader) {
108 event = call_handler(event->proc->leader, event);
109 if (event == NULL)
114 switch (event->type) {
116 debug(1, "event: none");
120 assert(event->proc != NULL);
121 debug(1, "[%d] event: signal (%s [%d])",
122 event->proc->pid,
123 shortsignal(event->proc, event->e_un.signum),
124 event->e_un.signum);
125 handle_signal(event);
129 assert(event->proc != NULL);
130 debug(1, "[%d] event: exit (%d)",
131 event->proc->pid,
132 event->e_un.ret_val);
133 handle_exit(event);
137 assert(event->proc != NULL);
138 debug(1, "[%d] event: exit signal (%s [%d])",
139 event->proc->pid,
140 shortsignal(event->proc, event->e_un.signum),
141 event->e_un.signum);
142 handle_exit_signal(event);
146 assert(event->proc != NULL);
147 debug(1, "[%d] event: syscall (%s [%d])",
148 event->proc->pid,
149 sysname(event->proc, event->e_un.sysnum),
150 event->e_un.sysnum);
151 handle_syscall(event);
155 assert(event->proc != NULL);
156 debug(1, "[%d] event: sysret (%s [%d])",
157 event->proc->pid,
158 sysname(event->proc, event->e_un.sysnum),
159 event->e_un.sysnum);
160 handle_sysret(event);
164 assert(event->proc != NULL);
165 debug(1, "[%d] event: arch_syscall (%s [%d])",
166 event->proc->pid,
167 arch_sysname(event->proc, event->e_un.sysnum),
168 event->e_un.sysnum);
169 handle_arch_syscall(event);
173 assert(event->proc != NULL);
174 debug(1, "[%d] event: arch_sysret (%s [%d])",
175 event->proc->pid,
176 arch_sysname(event->proc, event->e_un.sysnum),
177 event->e_un.sysnum);
178 handle_arch_sysret(event);
183 assert(event->proc != NULL);
184 debug(1, "[%d] event: clone (%u)",
185 event->proc->pid, event->e_un.newpid);
186 handle_clone(event);
190 assert(event->proc != NULL);
191 debug(1, "[%d] event: exec()",
192 event->proc->pid);
193 handle_exec(event);
197 assert(event->proc != NULL);
198 debug(1, "[%d] event: breakpoint %p",
199 event->proc->pid, event->e_un.brk_addr);
200 handle_breakpoint(event);
204 debug(1, "[%d] event: new process",
205 event->e_un.newpid);
206 handle_new(event);
209 fprintf(stderr, "Error! unknown event?\n");
269 handle_clone(Event *event)
271 debug(DEBUG_FUNCTION, "handle_clone(pid=%d)", event->proc->pid);
274 pid_t newpid = event->e_un.newpid;
276 || process_clone(proc, event->proc, newpid) < 0) {
284 proc->parent = event->proc;
296 if (event->proc->state == STATE_ATTACHED
309 if (event->type != EVENT_VFORK)
310 continue_process(event->proc->pid);
318 handle_new(Event *event)
320 debug(DEBUG_FUNCTION, "handle_new(pid=%d)", event->e_un.newpid);
322 struct process *proc = pid2proc(event->e_un.newpid);
324 pending_new_insert(event->e_un.newpid);
412 handle_signal(Event *event) {
413 debug(DEBUG_FUNCTION, "handle_signal(pid=%d, signum=%d)", event->proc->pid, event->e_un.signum);
414 if (event->proc->state != STATE_IGNORED && !options.no_signals) {
415 output_line(event->proc, "--- %s (%s) ---",
416 shortsignal(event->proc, event->e_un.signum),
417 strsignal(event->e_un.signum));
419 continue_after_signal(event->proc->pid, event->e_un.signum);
501 handle_exit(Event *event) {
502 debug(DEBUG_FUNCTION, "handle_exit(pid=%d, status=%d)", event->proc->pid, event->e_un.ret_val);
503 if (event->proc->state != STATE_IGNORED) {
504 output_line(event->proc, "+++ exited (status %d) +++",
505 event->e_un.ret_val);
508 account_current_callstack(event->proc);
509 remove_process(event->proc);
513 handle_exit_signal(Event *event) {
514 debug(DEBUG_FUNCTION, "handle_exit_signal(pid=%d, signum=%d)", event->proc->pid, event->e_un.signum);
515 if (event->proc->state != STATE_IGNORED) {
516 output_line(event->proc, "+++ killed by %s +++",
517 shortsignal(event->proc, event->e_un.signum));
520 account_current_callstack(event->proc);
521 remove_process(event->proc);
560 handle_syscall(Event *event)
562 debug(DEBUG_FUNCTION, "handle_syscall(pid=%d, sysnum=%d)", event->proc->pid, event->e_un.sysnum);
563 if (event->proc->state != STATE_IGNORED) {
564 callstack_push_syscall(event->proc, event->e_un.sysnum);
566 output_syscall_left(event->proc,
567 sysname(event->proc,
568 event->e_un.sysnum));
570 continue_after_syscall(event->proc, event->e_un.sysnum, 0);
574 handle_exec(Event *event)
576 struct process *proc = event->proc;
603 handle_arch_syscall(Event *event) {
604 debug(DEBUG_FUNCTION, "handle_arch_syscall(pid=%d, sysnum=%d)", event->proc->pid, event->e_un.sysnum);
605 if (event->proc->state != STATE_IGNORED) {
606 callstack_push_syscall(event->proc, 0xf0000 + event->e_un.sysnum);
608 output_syscall_left(event->proc,
609 arch_sysname(event->proc,
610 event->e_un.sysnum));
613 continue_process(event->proc->pid);
617 handle_x_sysret(Event *event, char *(*name_cb)(struct process *, int))
620 event->proc->pid, event->e_un.sysnum);
622 unsigned d = event->proc->callstack_depth;
624 struct callstack_element *elem = &event->proc->callstack[d - 1];
627 if (event->proc->state != STATE_IGNORED) {
630 output_syscall_right(event->proc,
631 name_cb(event->proc,
632 event->e_un.sysnum),
635 callstack_pop(event->proc);
637 continue_after_syscall(event->proc, event->e_un.sysnum, 1);
641 handle_sysret(Event *event)
643 handle_x_sysret(event, &sysname);
647 handle_arch_sysret(Event *event)
649 handle_x_sysret(event, &arch_sysname);
677 handle_breakpoint(Event *event)
681 struct process *leader = event->proc->leader;
682 void *brk_addr = event->e_un.brk_addr;
686 continue_process(event->proc->pid);
691 event->proc->pid, brk_addr);
692 debug(2, "event: breakpoint (%p)", brk_addr);
694 for (i = event->proc->callstack_depth - 1; i >= 0; i--) {
695 if (brk_addr == event->proc->callstack[i].return_addr) {
696 for (j = event->proc->callstack_depth - 1; j > i; j--)
697 callstack_pop(event->proc);
700 event->proc->callstack[i].c_un.libfunc;
702 arch_symbol_ret(event->proc, libsym);
703 output_right_tos(event->proc);
704 callstack_pop(event->proc);
712 while (event->proc->callstack_depth > 0) {
714 size_t d = event->proc->callstack_depth;
715 prev = &event->proc->callstack[d - 1];
721 arch_symbol_ret(event->proc,
723 output_right_tos(event->proc);
724 callstack_pop(event->proc);
732 continue_after_breakpoint(event->proc, sbp);
734 set_instruction_pointer(event->proc, brk_addr);
735 continue_process(event->proc->pid);
742 breakpoint_on_hit(sbp, event->proc);
743 else if (event->proc->state != STATE_IGNORED)
744 output_line(event->proc,
751 if (event->proc->state != STATE_IGNORED
753 event->proc->stack_pointer = get_stack_pointer(event->proc);
754 callstack_push_symfunc(event->proc, sbp);
756 output_left(LT_TOF_FUNCTION, event->proc,
760 breakpoint_on_continue(sbp, event->proc);
763 set_instruction_pointer(event->proc, brk_addr);
766 continue_process(event->proc->pid);