blob: 1c57532c6dfdb438eca50d14833eb72d00ca3a5c [file] [log] [blame]
Joe Damatoab3b72c2010-10-31 00:21:53 -07001#include "config.h"
2
3#if defined(HAVE_LIBUNWIND)
4#include <libunwind.h>
5#include <libunwind-ptrace.h>
6#endif /* defined(HAVE_LIBUNWIND) */
7
Juan Cespedes273ea6d1998-03-14 23:02:40 +01008#include <sys/types.h>
9#include <string.h>
10#include <stdio.h>
11#include <errno.h>
12#include <stdlib.h>
13
Juan Cespedesf7281232009-06-25 16:11:21 +020014#include "common.h"
Juan Cespedes273ea6d1998-03-14 23:02:40 +010015
Juan Cespedesa8909f72009-04-28 20:02:41 +020016Process *
Juan Cespedesf1350522008-12-16 18:19:58 +010017open_program(char *filename, pid_t pid) {
Juan Cespedesa8909f72009-04-28 20:02:41 +020018 Process *proc;
19 proc = calloc(sizeof(Process), 1);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010020 if (!proc) {
21 perror("malloc");
22 exit(1);
23 }
Juan Cespedese0660df2009-05-21 18:14:39 +020024 proc->filename = strdup(filename);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010025 proc->breakpoints_enabled = -1;
Ian Wienand2d45b1a2006-02-20 22:48:07 +010026 if (pid) {
27 proc->pid = pid;
Joe Damatoab3b72c2010-10-31 00:21:53 -070028#if defined(HAVE_LIBUNWIND)
29 proc->unwind_priv = _UPT_create(pid);
30 } else {
31 proc->unwind_priv = NULL;
32#endif /* defined(HAVE_LIBUNWIND) */
Ian Wienand2d45b1a2006-02-20 22:48:07 +010033 }
Joe Damatoab3b72c2010-10-31 00:21:53 -070034
Juan Cespedes7186e2a2003-01-31 19:56:34 +010035 breakpoints_init(proc);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010036
37 proc->next = list_of_processes;
38 list_of_processes = proc;
Joe Damatoab3b72c2010-10-31 00:21:53 -070039
40#if defined(HAVE_LIBUNWIND)
41 proc->unwind_as = unw_create_addr_space(&_UPT_accessors, 0);
42#endif /* defined(HAVE_LIBUNWIND) */
Juan Cespedes273ea6d1998-03-14 23:02:40 +010043 return proc;
44}
45
Juan Cespedesf1350522008-12-16 18:19:58 +010046void
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020047open_pid(pid_t pid) {
Juan Cespedesa8909f72009-04-28 20:02:41 +020048 Process *proc;
Ian Wienand2d45b1a2006-02-20 22:48:07 +010049 char *filename;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010050
Ian Wienand2d45b1a2006-02-20 22:48:07 +010051 if (trace_pid(pid) < 0) {
52 fprintf(stderr, "Cannot attach to pid %u: %s\n", pid,
53 strerror(errno));
Juan Cespedes35d70631998-03-15 14:05:40 +010054 return;
55 }
56
Juan Cespedes273ea6d1998-03-14 23:02:40 +010057 filename = pid2name(pid);
58
59 if (!filename) {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020060 fprintf(stderr, "Cannot trace pid %u: %s\n", pid,
Ian Wienand2d45b1a2006-02-20 22:48:07 +010061 strerror(errno));
Juan Cespedes273ea6d1998-03-14 23:02:40 +010062 return;
63 }
Juan Cespedes273ea6d1998-03-14 23:02:40 +010064
Ian Wienand9a2ad352006-02-20 22:44:45 +010065 proc = open_program(filename, pid);
Juan Cespedesaee09312007-08-31 18:49:48 +020066 continue_process(pid);
Ian Wienand9a2ad352006-02-20 22:44:45 +010067 proc->breakpoints_enabled = 1;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010068}
Juan Cespedese74c80d2009-02-11 11:32:31 +010069
Juan Cespedesa8909f72009-04-28 20:02:41 +020070Process *
Juan Cespedese74c80d2009-02-11 11:32:31 +010071pid2proc(pid_t pid) {
Juan Cespedesa8909f72009-04-28 20:02:41 +020072 Process *tmp;
Juan Cespedese74c80d2009-02-11 11:32:31 +010073
74 tmp = list_of_processes;
75 while (tmp) {
76 if (pid == tmp->pid) {
77 return tmp;
78 }
79 tmp = tmp->next;
80 }
81 return NULL;
82}