Lines Matching refs:proc

37 #include "proc.h"
42 os_process_init(struct process *proc)
48 os_process_destroy(struct process *proc)
53 os_process_clone(struct process *retp, struct process *proc)
59 os_process_exec(struct process *proc)
67 arch_process_init(struct process *proc)
73 arch_process_destroy(struct process *proc)
78 arch_process_clone(struct process *retp, struct process *proc)
84 arch_process_exec(struct process *proc)
92 arch_dynlink_done(struct process *proc)
97 static int add_process(struct process *proc, int was_exec);
98 static void unlist_process(struct process *proc);
101 destroy_unwind(struct process *proc)
104 if (proc->unwind_priv != NULL)
105 _UPT_destroy(proc->unwind_priv);
106 if (proc->unwind_as != NULL)
107 unw_destroy_addr_space(proc->unwind_as);
111 if (proc->dwfl != NULL)
112 dwfl_end(proc->dwfl);
117 process_bare_init(struct process *proc, const char *filename,
121 memset(proc, 0, sizeof(*proc));
123 proc->filename = strdup(filename);
124 if (proc->filename == NULL) {
126 free(proc->filename);
127 if (proc->breakpoints != NULL) {
128 dict_destroy(proc->breakpoints,
130 free(proc->breakpoints);
131 proc->breakpoints = NULL;
138 proc->pid = pid;
139 if (add_process(proc, was_exec) < 0)
141 if (proc->leader == NULL) {
144 unlist_process(proc);
148 if (proc->leader == proc) {
149 proc->breakpoints = malloc(sizeof(*proc->breakpoints));
150 if (proc->breakpoints == NULL)
152 DICT_INIT(proc->breakpoints,
156 proc->breakpoints = NULL;
161 proc->unwind_priv = _UPT_create(pid);
162 proc->unwind_as = unw_create_addr_space(&_UPT_accessors, 0);
164 if (proc->unwind_priv == NULL || proc->unwind_as == NULL) {
167 "for process %d\n", proc->pid);
168 destroy_unwind(proc);
169 proc->unwind_priv = NULL;
170 proc->unwind_as = NULL;
176 proc->dwfl = NULL; /* Initialize for leader only on first library. */
183 process_bare_destroy(struct process *proc, int was_exec)
185 dict_destroy(proc->breakpoints, NULL, NULL, NULL);
186 free(proc->breakpoints);
188 free(proc->filename);
189 unlist_process(proc);
190 destroy_unwind(proc);
195 process_init_main(struct process *proc)
197 if (breakpoints_init(proc) < 0) {
199 proc->pid);
207 process_init(struct process *proc, const char *filename, pid_t pid)
209 if (process_bare_init(proc, filename, pid, 0) < 0) {
216 if (os_process_init(proc) < 0) {
217 process_bare_destroy(proc, 0);
221 if (arch_process_init(proc) < 0) {
222 os_process_destroy(proc);
223 process_bare_destroy(proc, 0);
227 if (proc->leader != proc) {
228 proc->e_machine = proc->leader->e_machine;
229 proc->e_class = proc->leader->e_class;
230 get_arch_dep(proc);
231 } else if (process_init_main(proc) < 0) {
232 process_bare_destroy(proc, 0);
239 destroy_breakpoint_cb(struct process *proc, struct breakpoint *bp, void *data)
247 void callstack_pop(struct process *proc);
250 private_process_destroy(struct process *proc, int was_exec)
253 while (proc->callstack_depth > 0) {
260 size_t i = proc->callstack_depth - 1;
261 if (!proc->callstack[i].is_syscall)
262 proc->callstack[i].return_addr = 0;
264 callstack_pop(proc);
268 free(proc->filename);
273 for (lib = proc->libraries; lib != NULL; ) {
279 proc->libraries = NULL;
282 if (proc->breakpoints != NULL) {
283 proc_each_breakpoint(proc, NULL, destroy_breakpoint_cb, NULL);
284 dict_destroy(proc->breakpoints, NULL, NULL, NULL);
285 free(proc->breakpoints);
286 proc->breakpoints = NULL;
289 destroy_unwind(proc);
293 process_destroy(struct process *proc)
295 arch_process_destroy(proc);
296 os_process_destroy(proc);
297 private_process_destroy(proc, 0);
301 process_exec(struct process *proc)
305 if (arch_process_exec(proc) < 0
306 || os_process_exec(proc) < 0)
309 private_process_destroy(proc, 1);
311 if (process_bare_init(proc, NULL, proc->pid, 1) < 0)
313 if (process_init_main(proc) < 0) {
314 process_bare_destroy(proc, 1);
324 struct process *proc = malloc(sizeof(*proc));
325 if (proc == NULL || process_init(proc, filename, pid) < 0) {
326 free(proc);
329 return proc;
358 process_clone(struct process *retp, struct process *proc, pid_t pid)
360 if (process_bare_init(retp, proc->filename, pid, 0) < 0) {
363 proc->pid, pid, strerror(errno));
367 retp->tracesysgood = proc->tracesysgood;
368 retp->e_machine = proc->e_machine;
369 retp->e_class = proc->e_class;
379 for (lib = proc->leader->libraries; lib != NULL; lib = lib->next) {
406 .old_proc = proc,
409 if (DICT_EACH(proc->leader->breakpoints,
418 memcpy(retp->callstack, proc->callstack, sizeof(retp->callstack));
419 retp->callstack_depth = proc->callstack_depth;
474 if (os_process_clone(retp, proc) < 0) {
478 if (arch_process_clone(retp, proc) < 0) {
501 struct process *proc = open_program(filename, pid);
502 if (proc == NULL)
505 trace_set_options(proc);
511 start_one_pid(struct process *proc, void *data)
513 continue_process(proc->pid);
518 is_main(struct process *proc, struct library *lib, void *data)
524 process_hit_start(struct process *proc)
526 struct process *leader = proc->leader;
599 find_proc(struct process *proc, void *data)
601 return CBS_STOP_IF(proc->pid == (pid_t)(uintptr_t)data);
613 unlist_process(struct process *proc)
615 if (list_of_processes == proc) {
626 if (tmp->next == proc) {
635 enum callback_status(*cb)(struct process *proc, void *data),
658 each_task(struct process *proc, struct process *start_after,
659 enum callback_status(*cb)(struct process *proc, void *data),
662 assert(proc != NULL);
663 struct process *it = start_after == NULL ? proc->leader
686 add_process(struct process *proc, int was_exec)
689 if (proc->pid) {
690 pid_t tgid = process_leader(proc->pid);
695 if (tgid == proc->pid) {
696 proc->leader = proc;
699 proc->leader = leader;
706 proc->next = *leaderp;
707 *leaderp = proc;
713 change_process_leader(struct process *proc, struct process *leader)
716 if (proc->leader == leader)
720 unlist_process(proc);
721 if (proc != leader)
724 proc->leader = leader;
725 proc->next = *leaderp;
726 *leaderp = proc;
730 clear_leader(struct process *proc, void *data)
733 proc->pid, proc->leader->pid);
734 proc->leader = NULL;
739 remove_process(struct process *proc)
741 debug(DEBUG_FUNCTION, "remove_proc(pid=%d)", proc->pid);
743 if (proc->leader == proc)
744 each_task(proc, NULL, &clear_leader, NULL);
746 unlist_process(proc);
747 process_removed(proc);
748 process_destroy(proc);
749 free(proc);
753 install_event_handler(struct process *proc, struct event_handler *handler)
755 debug(DEBUG_FUNCTION, "install_event_handler(pid=%d, %p)", proc->pid, handler);
756 assert(proc->event_handler == NULL);
757 proc->event_handler = handler;
761 destroy_event_handler(struct process *proc)
763 struct event_handler *handler = proc->event_handler;
764 debug(DEBUG_FUNCTION, "destroy_event_handler(pid=%d, %p)", proc->pid, handler);
769 proc->event_handler = NULL;
773 breakpoint_for_symbol(struct library_symbol *libsym, struct process *proc)
776 assert(proc->leader == proc);
782 proc->pid, libsym->name, libsym->enter_addr);
786 bp_addr = sym2addr(proc, libsym);
801 if (DICT_FIND_VAL(proc->breakpoints, &bp_addr, &bp) == 0) {
823 || breakpoint_init(bp, proc, bp_addr, libsym) < 0) {
828 if (proc_add_breakpoint(proc, bp) < 0) {
833 if (breakpoint_turn_on(bp, proc) < 0) {
834 proc_remove_breakpoint(proc, bp);
849 proc_activate_latent_symbol(struct process *proc,
855 return breakpoint_for_symbol(libsym, proc);
859 proc_activate_delayed_symbol(struct process *proc,
865 return breakpoint_for_symbol(libsym, proc);
869 activate_latent_in(struct process *proc, struct library *lib, void *data)
879 && proc_activate_latent_symbol(proc, libsym) < 0)
886 proc_add_library(struct process *proc, struct library *lib)
889 lib->next = proc->libraries;
890 proc->libraries = lib;
892 lib->soname, lib->base, lib->pathname, proc->pid);
897 struct process *leader = proc->leader;
921 proc->pid, dwfl_errmsg (-1));
951 proc)) != NULL)
954 libsym->name, proc->pid, strerror(errno));
960 while ((lib2 = proc_each_library(proc, lib2, activate_latent_in,
964 lib2->soname, proc->pid, strerror(errno));
968 proc_remove_library(struct process *proc, struct library *lib)
971 for (libp = &proc->libraries; *libp != NULL; libp = &(*libp)->next)
980 proc_each_library(struct process *proc, struct library *it,
981 enum callback_status (*cb)(struct process *proc,
986 it = proc->libraries;
993 switch (cb(proc, it, data)) {
1009 check_leader(struct process *proc)
1013 assert(proc->leader != NULL);
1014 assert(proc->leader == proc);
1015 assert(proc->breakpoints != NULL);
1019 proc_add_breakpoint(struct process *proc, struct breakpoint *bp)
1022 proc->pid, breakpoint_name(bp), bp->addr);
1023 check_leader(proc);
1028 assert(dict_find(proc->breakpoints, &bp->addr) == NULL);
1030 if (DICT_INSERT(proc->breakpoints, &bp->addr, &bp) < 0) {
1041 proc_remove_breakpoint(struct process *proc, struct breakpoint *bp)
1044 proc->pid, breakpoint_name(bp), bp->addr);
1045 check_leader(proc);
1046 int rc = DICT_ERASE(proc->breakpoints, &bp->addr, struct breakpoint *,
1053 struct process *proc;
1054 enum callback_status (*cb)(struct process *proc,
1064 return data->cb(data->proc, *bpp, data->cb_data);
1068 proc_each_breakpoint(struct process *proc, arch_addr_t *start,
1069 enum callback_status (*cb)(struct process *proc,
1074 .proc = proc,
1078 return DICT_EACH(proc->breakpoints,
1084 proc_find_symbol(struct process *proc, struct library_symbol *sym,
1091 = proc_each_library(proc, NULL, library_with_key_cb, &lib->key);
1110 proc_each_symbol(struct process *proc, struct library_symbol *start_after,
1115 for (lib = start_after != NULL ? start_after->lib : proc->libraries;
1127 NAME(struct process *proc, arch_addr_t addr, \
1134 if (umovebytes(proc, addr, &u.buf, sizeof(u.dst)) \