forked from namhyung/uftrace
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdbginfo.c
105 lines (88 loc) · 2.24 KB
/
dbginfo.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <getopt.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "utils/dwarf.h"
#include "utils/filter.h"
#include "utils/symbol.h"
void print_debug_info(struct uftrace_dbg_info *dinfo, bool auto_args)
{
size_t i;
char *argspec = NULL;
char *retspec = NULL;
/* TODO: print enum definitions */
for (i = 0; i < dinfo->nr_locs; i++) {
struct uftrace_dbg_loc *loc = &dinfo->locs[i];
int idx = 0;
if (loc->sym == NULL)
continue;
argspec = get_dwarf_argspec(dinfo, loc->sym->name, loc->sym->addr);
retspec = get_dwarf_retspec(dinfo, loc->sym->name, loc->sym->addr);
if (argspec == NULL && retspec == NULL && !auto_args)
continue;
printf("%s [addr: %" PRIx64 "]\n", loc->sym->name, loc->sym->addr);
/* skip common parts with compile directory */
if (dinfo->base_dir) {
int len = strlen(dinfo->base_dir);
if (!strncmp(loc->file->name, dinfo->base_dir, len))
idx = len + 1;
}
printf(" srcline: %s:%d\n", loc->file->name + idx, loc->line);
if (argspec)
printf(" argspec: %s\n", argspec);
if (retspec)
printf(" retspec: %s\n", retspec);
}
}
int main(int argc, char *argv[])
{
struct uftrace_mmap *map;
struct uftrace_sym_info sinfo = {
.dirname = ".",
.flags = SYMTAB_FL_DEMANGLE,
};
char *argspec = NULL;
char *retspec = NULL;
char *filename = NULL;
bool auto_args = false;
enum uftrace_pattern_type ptype = PATT_REGEX;
int opt;
while ((opt = getopt(argc, argv, "aA:R:v")) != -1) {
switch (opt) {
case 'a':
auto_args = true;
break;
case 'A':
argspec = optarg;
break;
case 'R':
retspec = optarg;
break;
case 'v':
debug++;
dbg_domain[DBG_DWARF]++;
break;
default:
printf("dbginfo: unknown option: %c\n", opt);
return 1;
}
}
if (optind >= argc) {
printf("Usage: dbginfo [-a | -A <arg> | -R <ret>] <filename>\n");
return 1;
}
filename = argv[optind];
logfp = stderr;
outfp = stdout;
map = xzalloc(sizeof(*map) + strlen(filename) + 1);
strcpy(map->libname, filename);
sinfo.maps = map;
load_module_symtabs(&sinfo);
prepare_debug_info(&sinfo, ptype, argspec, retspec, auto_args, false);
print_debug_info(&map->mod->dinfo, auto_args);
finish_debug_info(&sinfo);
unload_module_symtabs();
free(map);
return 0;
}