mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
libsysprof-analyze: implement various SysprofElf API
This wraps our ElfParser to give us an idiomatic API we can use with GIO/GTK/etc.
This commit is contained in:
@ -34,7 +34,7 @@ SysprofElf *sysprof_elf_new (const char *filename,
|
|||||||
const char *sysprof_elf_get_file (SysprofElf *self);
|
const char *sysprof_elf_get_file (SysprofElf *self);
|
||||||
const char *sysprof_elf_get_build_id (SysprofElf *self);
|
const char *sysprof_elf_get_build_id (SysprofElf *self);
|
||||||
const char *sysprof_elf_get_debug_link (SysprofElf *self);
|
const char *sysprof_elf_get_debug_link (SysprofElf *self);
|
||||||
const char *sysprof_elf_get_symbol_at_address (SysprofElf *self,
|
char *sysprof_elf_get_symbol_at_address (SysprofElf *self,
|
||||||
guint64 address,
|
guint64 address,
|
||||||
guint64 *begin_address,
|
guint64 *begin_address,
|
||||||
guint64 *end_address);
|
guint64 *end_address);
|
||||||
|
|||||||
@ -28,7 +28,6 @@ struct _SysprofElf
|
|||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
char *build_id;
|
char *build_id;
|
||||||
char *debug_link;
|
|
||||||
char *file;
|
char *file;
|
||||||
SysprofElf *debug_link_elf;
|
SysprofElf *debug_link_elf;
|
||||||
ElfParser *parser;
|
ElfParser *parser;
|
||||||
@ -53,7 +52,6 @@ sysprof_elf_finalize (GObject *object)
|
|||||||
SysprofElf *self = (SysprofElf *)object;
|
SysprofElf *self = (SysprofElf *)object;
|
||||||
|
|
||||||
g_clear_pointer (&self->build_id, g_free);
|
g_clear_pointer (&self->build_id, g_free);
|
||||||
g_clear_pointer (&self->debug_link, g_free);
|
|
||||||
g_clear_pointer (&self->file, g_free);
|
g_clear_pointer (&self->file, g_free);
|
||||||
g_clear_pointer (&self->parser, elf_parser_free);
|
g_clear_pointer (&self->parser, elf_parser_free);
|
||||||
g_clear_object (&self->debug_link_elf);
|
g_clear_object (&self->debug_link_elf);
|
||||||
@ -187,24 +185,51 @@ sysprof_elf_get_build_id (SysprofElf *self)
|
|||||||
const char *
|
const char *
|
||||||
sysprof_elf_get_debug_link (SysprofElf *self)
|
sysprof_elf_get_debug_link (SysprofElf *self)
|
||||||
{
|
{
|
||||||
|
guint crc32;
|
||||||
|
|
||||||
g_return_val_if_fail (SYSPROF_IS_ELF (self), NULL);
|
g_return_val_if_fail (SYSPROF_IS_ELF (self), NULL);
|
||||||
|
|
||||||
return self->debug_link;
|
return elf_parser_get_debug_link (self->parser, &crc32);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
char *
|
||||||
sysprof_elf_get_symbol_at_address (SysprofElf *self,
|
sysprof_elf_get_symbol_at_address (SysprofElf *self,
|
||||||
guint64 address,
|
guint64 address,
|
||||||
guint64 *begin_address,
|
guint64 *begin_address,
|
||||||
guint64 *end_address)
|
guint64 *end_address)
|
||||||
{
|
{
|
||||||
|
const ElfSym *symbol;
|
||||||
|
char *ret = NULL;
|
||||||
|
gulong begin = 0;
|
||||||
|
gulong end = 0;
|
||||||
|
|
||||||
g_return_val_if_fail (SYSPROF_IS_ELF (self), NULL);
|
g_return_val_if_fail (SYSPROF_IS_ELF (self), NULL);
|
||||||
g_return_val_if_fail (begin_address != NULL, NULL);
|
|
||||||
g_return_val_if_fail (end_address != NULL, NULL);
|
|
||||||
|
|
||||||
*begin_address = *end_address = 0;
|
if (self->debug_link_elf != NULL)
|
||||||
|
return sysprof_elf_get_symbol_at_address (self->debug_link_elf, address, begin_address, end_address);
|
||||||
|
|
||||||
return NULL;
|
if ((symbol = elf_parser_lookup_symbol (self->parser, address)))
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
if (begin_address || end_address)
|
||||||
|
elf_parser_get_sym_address_range (self->parser, symbol, &begin, &end);
|
||||||
|
|
||||||
|
name = elf_parser_get_sym_name (self->parser, symbol);
|
||||||
|
|
||||||
|
if (name != NULL && name[0] == '_' && name[1] == 'Z')
|
||||||
|
ret = elf_demangle (name);
|
||||||
|
else
|
||||||
|
ret = g_strdup (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (begin_address)
|
||||||
|
*begin_address = begin;
|
||||||
|
|
||||||
|
if (end_address)
|
||||||
|
*end_address = end;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user