Add debugging stats to hashtable.
[kmemtrace-user.git] / addr2line.c
blobd6e001c00d8092506b42833b814582d86113b4b4
1 /*
2 * Copyright (C) 2008 Eduard - Gabriel Munteanu
4 * This file is released under GPL version 2.
5 */
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <unistd.h>
11 #include <errno.h>
13 #include <addr2line.h>
14 #include <config.h>
16 static int our_pipe[2], a2l_pipe[2]; /* "Ownership" defined by who reads. */
17 static int addr2line_running;
19 int addr2line_init(const char *vmlinux_path)
21 char tmp[500];
23 pid_t pid;
25 if (addr2line_running)
26 return -EEXIST;
28 if (pipe(our_pipe) < 0)
29 goto err;
30 if (pipe(a2l_pipe) < 0)
31 goto err;
33 pid = fork();
34 if (pid < 0)
35 goto err;
36 else if (!pid) {
37 close(0);
38 dup(a2l_pipe[0]);
39 close(1);
40 dup(our_pipe[1]);
41 sprintf(tmp, "--exe=%s", vmlinux_path);
42 exit(execl(ADDR2LINE_PATH, ADDR2LINE_PATH,
43 "-i", tmp, (char *) NULL));
44 } else {
45 addr2line_running = 1;
48 return 0;
50 err:
51 return -1;
54 void addr2line_exit(void)
56 close(a2l_pipe[1]);
57 close(our_pipe[0]);
60 ssize_t addr2line_query(void *addr, char *result, size_t len)
62 char ptr_str[32];
63 size_t ptr_str_len;
64 ssize_t count;
66 sprintf(ptr_str, "%p\n", addr);
67 ptr_str_len = strlen(ptr_str);
68 count = write(a2l_pipe[1], ptr_str, ptr_str_len);
69 if (count < ptr_str_len)
70 return -EIO;
72 count = read(our_pipe[0], result, len - 1);
73 result[count - 1] = '\0'; /* addr2line terminates lines with '\n' */
75 return count;