blob: dcad7073713ca2588ea8ef8469177c8234cc1f33 [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>
Petr Machata1b17dbf2011-07-08 19:22:52 +020013#include <assert.h>
Juan Cespedes273ea6d1998-03-14 23:02:40 +010014
Juan Cespedesf7281232009-06-25 16:11:21 +020015#include "common.h"
Juan Cespedes273ea6d1998-03-14 23:02:40 +010016
Juan Cespedesa8909f72009-04-28 20:02:41 +020017Process *
Juan Cespedesf1350522008-12-16 18:19:58 +010018open_program(char *filename, pid_t pid) {
Juan Cespedesa8909f72009-04-28 20:02:41 +020019 Process *proc;
Petr Machata1b17dbf2011-07-08 19:22:52 +020020 assert(pid != 0);
Juan Cespedesa8909f72009-04-28 20:02:41 +020021 proc = calloc(sizeof(Process), 1);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010022 if (!proc) {
23 perror("malloc");
24 exit(1);
25 }
Juan Cespedese0660df2009-05-21 18:14:39 +020026 proc->filename = strdup(filename);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010027 proc->breakpoints_enabled = -1;
Petr Machata1b17dbf2011-07-08 19:22:52 +020028 proc->pid = pid;
Joe Damatoab3b72c2010-10-31 00:21:53 -070029#if defined(HAVE_LIBUNWIND)
Petr Machata1b17dbf2011-07-08 19:22:52 +020030 proc->unwind_priv = _UPT_create(pid);
31 proc->unwind_as = unw_create_addr_space(&_UPT_accessors, 0);
Joe Damatoab3b72c2010-10-31 00:21:53 -070032#endif /* defined(HAVE_LIBUNWIND) */
Joe Damatoab3b72c2010-10-31 00:21:53 -070033
Juan Cespedes7186e2a2003-01-31 19:56:34 +010034 breakpoints_init(proc);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010035
36 proc->next = list_of_processes;
37 list_of_processes = proc;
Joe Damatoab3b72c2010-10-31 00:21:53 -070038
Juan Cespedes273ea6d1998-03-14 23:02:40 +010039 return proc;
40}
41
Juan Cespedesf1350522008-12-16 18:19:58 +010042void
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020043open_pid(pid_t pid) {
Juan Cespedesa8909f72009-04-28 20:02:41 +020044 Process *proc;
Ian Wienand2d45b1a2006-02-20 22:48:07 +010045 char *filename;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010046
Ian Wienand2d45b1a2006-02-20 22:48:07 +010047 if (trace_pid(pid) < 0) {
48 fprintf(stderr, "Cannot attach to pid %u: %s\n", pid,
49 strerror(errno));
Juan Cespedes35d70631998-03-15 14:05:40 +010050 return;
51 }
52
Juan Cespedes273ea6d1998-03-14 23:02:40 +010053 filename = pid2name(pid);
54
55 if (!filename) {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020056 fprintf(stderr, "Cannot trace pid %u: %s\n", pid,
Ian Wienand2d45b1a2006-02-20 22:48:07 +010057 strerror(errno));
Juan Cespedes273ea6d1998-03-14 23:02:40 +010058 return;
59 }
Juan Cespedes273ea6d1998-03-14 23:02:40 +010060
Ian Wienand9a2ad352006-02-20 22:44:45 +010061 proc = open_program(filename, pid);
Juan Cespedesaee09312007-08-31 18:49:48 +020062 continue_process(pid);
Ian Wienand9a2ad352006-02-20 22:44:45 +010063 proc->breakpoints_enabled = 1;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010064}
Juan Cespedese74c80d2009-02-11 11:32:31 +010065
Juan Cespedesa8909f72009-04-28 20:02:41 +020066Process *
Juan Cespedese74c80d2009-02-11 11:32:31 +010067pid2proc(pid_t pid) {
Juan Cespedesa8909f72009-04-28 20:02:41 +020068 Process *tmp;
Juan Cespedese74c80d2009-02-11 11:32:31 +010069
70 tmp = list_of_processes;
71 while (tmp) {
72 if (pid == tmp->pid) {
73 return tmp;
74 }
75 tmp = tmp->next;
76 }
77 return NULL;
78}