mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
libsysprof: use helpers for proc access
This commit is contained in:
@ -88,16 +88,22 @@ type_is_ignored (guint8 type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
sysprof_kernel_symbol_load_from_sysprofd (void)
|
sysprof_kernel_symbol_load (void)
|
||||||
{
|
{
|
||||||
SysprofHelpers *helpers = sysprof_helpers_get_default ();
|
SysprofHelpers *helpers = sysprof_helpers_get_default ();
|
||||||
g_autoptr(SysprofKallsyms) kallsyms = NULL;
|
g_autoptr(SysprofKallsyms) kallsyms = NULL;
|
||||||
g_autofree gchar *contents = NULL;
|
g_autoptr(GHashTable) skip = NULL;
|
||||||
g_autoptr(GArray) ar = NULL;
|
g_autoptr(GArray) ar = NULL;
|
||||||
|
g_autofree gchar *contents = NULL;
|
||||||
const gchar *name;
|
const gchar *name;
|
||||||
guint64 addr;
|
guint64 addr;
|
||||||
guint8 type;
|
guint8 type;
|
||||||
|
|
||||||
|
skip = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
|
for (guint i = 0; i < G_N_ELEMENTS (kernel_symbols_skip); i++)
|
||||||
|
g_hash_table_insert (skip, (gchar *)kernel_symbols_skip[i], NULL);
|
||||||
|
kernel_symbols_skip_hash = g_steal_pointer (&skip);
|
||||||
|
|
||||||
if (!sysprof_helpers_get_proc_file (helpers, "/proc/kallsyms", NULL, &contents, NULL))
|
if (!sysprof_helpers_get_proc_file (helpers, "/proc/kallsyms", NULL, &contents, NULL))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
@ -129,62 +135,11 @@ sysprof_kernel_symbol_load_from_sysprofd (void)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
sysprof_kernel_symbol_load (void)
|
|
||||||
{
|
|
||||||
g_autoptr(GHashTable) skip = NULL;
|
|
||||||
g_autoptr(SysprofKallsyms) kallsyms = NULL;
|
|
||||||
g_autoptr(GArray) ar = NULL;
|
|
||||||
const gchar *name;
|
|
||||||
guint64 addr;
|
|
||||||
guint8 type;
|
|
||||||
|
|
||||||
skip = g_hash_table_new (g_str_hash, g_str_equal);
|
|
||||||
for (guint i = 0; i < G_N_ELEMENTS (kernel_symbols_skip); i++)
|
|
||||||
g_hash_table_insert (skip, (gchar *)kernel_symbols_skip[i], NULL);
|
|
||||||
kernel_symbols_skip_hash = g_steal_pointer (&skip);
|
|
||||||
|
|
||||||
kernel_symbol_strs = g_string_chunk_new (4096);
|
|
||||||
ar = g_array_new (FALSE, TRUE, sizeof (SysprofKernelSymbol));
|
|
||||||
|
|
||||||
if (!(kallsyms = sysprof_kallsyms_new (NULL)))
|
|
||||||
goto query_daemon;
|
|
||||||
|
|
||||||
while (sysprof_kallsyms_next (kallsyms, &name, &addr, &type))
|
|
||||||
{
|
|
||||||
SysprofKernelSymbol sym;
|
|
||||||
|
|
||||||
if (type_is_ignored (type))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
sym.address = addr;
|
|
||||||
sym.name = g_string_chunk_insert_const (kernel_symbol_strs, name);
|
|
||||||
|
|
||||||
g_array_append_val (ar, sym);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ar->len == 0)
|
|
||||||
goto query_daemon;
|
|
||||||
|
|
||||||
g_array_sort (ar, sysprof_kernel_symbol_compare);
|
|
||||||
kernel_symbols = g_steal_pointer (&ar);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
query_daemon:
|
|
||||||
if (sysprof_kernel_symbol_load_from_sysprofd ())
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
g_warning ("Kernel symbols will not be available.");
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const SysprofKernelSymbol *
|
static const SysprofKernelSymbol *
|
||||||
sysprof_kernel_symbol_lookup (SysprofKernelSymbol *symbols,
|
sysprof_kernel_symbol_lookup (SysprofKernelSymbol *symbols,
|
||||||
SysprofCaptureAddress address,
|
SysprofCaptureAddress address,
|
||||||
guint first,
|
guint first,
|
||||||
guint last)
|
guint last)
|
||||||
{
|
{
|
||||||
if (address >= symbols [last].address)
|
if (address >= symbols [last].address)
|
||||||
{
|
{
|
||||||
@ -250,9 +205,9 @@ sysprof_kernel_symbol_from_address (SysprofCaptureAddress address)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ret = sysprof_kernel_symbol_lookup ((SysprofKernelSymbol *)(gpointer)kernel_symbols->data,
|
ret = sysprof_kernel_symbol_lookup ((SysprofKernelSymbol *)(gpointer)kernel_symbols->data,
|
||||||
address,
|
address,
|
||||||
0,
|
0,
|
||||||
kernel_symbols->len - 1);
|
kernel_symbols->len - 1);
|
||||||
|
|
||||||
/* We resolve all symbols, including ignored symbols so that we
|
/* We resolve all symbols, including ignored symbols so that we
|
||||||
* don't give back the wrong function juxtapose an ignored func.
|
* don't give back the wrong function juxtapose an ignored func.
|
||||||
|
|||||||
Reference in New Issue
Block a user