-
Notifications
You must be signed in to change notification settings - Fork 165
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Provide source code info for Symbol #180
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -4,8 +4,14 @@ | |||||||||||||||||||||||||||||||||||||||||
#include <elf.h> | ||||||||||||||||||||||||||||||||||||||||||
#include <stdlib.h> | ||||||||||||||||||||||||||||||||||||||||||
#include <string.h> | ||||||||||||||||||||||||||||||||||||||||||
#include <dwarf.h> | ||||||||||||||||||||||||||||||||||||||||||
#include <elfutils/libdw.h> | ||||||||||||||||||||||||||||||||||||||||||
#include <elfutils/libdwfl.h> | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
#include "debug_info.h" | ||||||||||||||||||||||||||||||||||||||||||
#include "drgn.h" | ||||||||||||||||||||||||||||||||||||||||||
#include "error.h" | ||||||||||||||||||||||||||||||||||||||||||
#include "program.h" | ||||||||||||||||||||||||||||||||||||||||||
#include "symbol.h" | ||||||||||||||||||||||||||||||||||||||||||
#include "util.h" | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
|
@@ -40,6 +46,44 @@ void drgn_symbol_from_elf(const char *name, uint64_t address, | |||||||||||||||||||||||||||||||||||||||||
ret->kind = DRGN_SYMBOL_KIND_UNKNOWN; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
LIBDRGN_PUBLIC struct drgn_error * | ||||||||||||||||||||||||||||||||||||||||||
drgn_symbol_source(struct drgn_symbol *sym, | ||||||||||||||||||||||||||||||||||||||||||
struct drgn_program *prog, | ||||||||||||||||||||||||||||||||||||||||||
unsigned long offset, | ||||||||||||||||||||||||||||||||||||||||||
size_t size, | ||||||||||||||||||||||||||||||||||||||||||
char *src_file_ret, | ||||||||||||||||||||||||||||||||||||||||||
int *line_num_ret, | ||||||||||||||||||||||||||||||||||||||||||
int *line_col_ret) | ||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||
if (sym->kind != DRGN_SYMBOL_KIND_FUNC) | ||||||||||||||||||||||||||||||||||||||||||
return drgn_error_create(DRGN_ERROR_LOOKUP, | ||||||||||||||||||||||||||||||||||||||||||
"symbol is not a function"); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
unsigned long sym_address = sym->address + offset; | ||||||||||||||||||||||||||||||||||||||||||
struct drgn_debug_info_module *dim; | ||||||||||||||||||||||||||||||||||||||||||
dim = drgn_debug_info_module_byaddress(prog->dbinfo, sym_address); | ||||||||||||||||||||||||||||||||||||||||||
if (dim == NULL) | ||||||||||||||||||||||||||||||||||||||||||
return drgn_error_create(DRGN_ERROR_LOOKUP, | ||||||||||||||||||||||||||||||||||||||||||
"could not locate module from function address"); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
Dwfl_Line *line = dwfl_module_getsrc(dim->dwfl_module, sym_address); | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
struct drgn_error *
drgn_debug_info_module_find_dwarf_cu(struct drgn_debug_info_module *module,
uint64_t pc, uint64_t *bias_ret,
Dwarf_Die *cu_die_ret) Which would be very similar to the beginning of Lines 312 to 331 in 330c71b
|
||||||||||||||||||||||||||||||||||||||||||
if (line == NULL) | ||||||||||||||||||||||||||||||||||||||||||
return drgn_error_create(DRGN_ERROR_LOOKUP, | ||||||||||||||||||||||||||||||||||||||||||
"could not obtain source code information"); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const char *src; | ||||||||||||||||||||||||||||||||||||||||||
int lineno, linecol; | ||||||||||||||||||||||||||||||||||||||||||
if ((src = dwfl_lineinfo(line, &sym_address, &lineno, &linecol, | ||||||||||||||||||||||||||||||||||||||||||
NULL, NULL)) != NULL) { | ||||||||||||||||||||||||||||||||||||||||||
strncpy(src_file_ret, src, size); | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd rather that we just |
||||||||||||||||||||||||||||||||||||||||||
*line_num_ret = lineno; | ||||||||||||||||||||||||||||||||||||||||||
*line_col_ret = linecol; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
return NULL; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
LIBDRGN_PUBLIC const char *drgn_symbol_name(struct drgn_symbol *sym) | ||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||
return sym->name; | ||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rather than adding this, you can look up the
Dwfl_Module *
for an address withdwfl_addrmodule()
. If you need thestruct drgn_debug_info_module *
, too, you can get it withdwfl_module_info()
. Here's an example:drgn/libdrgn/register_state.c
Lines 89 to 96 in 330c71b