mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
libsysprof-capture: translate jitmaps before samples
So we have valid addresses to translate, we need to translate the jitmap before we translate samples. Otherwise we likely won't have anything to translate.
This commit is contained in:
@ -111,7 +111,7 @@ translate_table_add (GArray **tables,
|
||||
guint64 src,
|
||||
guint64 dst)
|
||||
{
|
||||
TranslateItem item = { src, dst };
|
||||
const TranslateItem item = { src, dst };
|
||||
|
||||
if (tables[table] == NULL)
|
||||
tables[table] = g_array_new (FALSE, FALSE, sizeof (TranslateItem));
|
||||
@ -127,6 +127,9 @@ translate_table_translate (GArray **tables,
|
||||
const TranslateItem *item;
|
||||
TranslateItem key = { src, 0 };
|
||||
|
||||
if ((src & SYSPROF_CAPTURE_JITMAP_MARK) == 0)
|
||||
return src;
|
||||
|
||||
if (!tables[table])
|
||||
return src;
|
||||
|
||||
@ -161,6 +164,42 @@ sysprof_capture_writer_cat (SysprofCaptureWriter *self,
|
||||
if (start_time < first_start_time)
|
||||
first_start_time = start_time;
|
||||
|
||||
/* First we need to find all the JIT maps so that we can translate
|
||||
* addresses later on and have the correct value.
|
||||
*/
|
||||
while (sysprof_capture_reader_peek_type (reader, &type))
|
||||
{
|
||||
g_autoptr(GHashTable) jitmap = NULL;
|
||||
GHashTableIter iter;
|
||||
const gchar *name;
|
||||
guint64 addr;
|
||||
|
||||
if (type != SYSPROF_CAPTURE_FRAME_JITMAP)
|
||||
{
|
||||
if (!sysprof_capture_reader_skip (reader))
|
||||
goto panic;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(jitmap = sysprof_capture_reader_read_jitmap (reader)))
|
||||
goto panic;
|
||||
|
||||
g_hash_table_iter_init (&iter, jitmap);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer *)&addr, (gpointer *)&name))
|
||||
{
|
||||
guint64 replace = sysprof_capture_writer_add_jitmap (self, name);
|
||||
/* We need to keep a table of replacement addresses so that
|
||||
* we can translate the samples into the destination address
|
||||
* space that we synthesized for the address identifier.
|
||||
*/
|
||||
translate_table_add (tables, TRANSLATE_ADDR, addr, replace);
|
||||
}
|
||||
}
|
||||
|
||||
translate_table_sort (tables, TRANSLATE_ADDR);
|
||||
|
||||
sysprof_capture_reader_reset (reader);
|
||||
|
||||
while (sysprof_capture_reader_peek_type (reader, &type))
|
||||
{
|
||||
SysprofCaptureFrame fr;
|
||||
@ -324,34 +363,6 @@ sysprof_capture_writer_cat (SysprofCaptureWriter *self,
|
||||
break;
|
||||
}
|
||||
|
||||
case SYSPROF_CAPTURE_FRAME_JITMAP:
|
||||
{
|
||||
GHashTable *jitmap;
|
||||
GHashTableIter iter;
|
||||
const gchar *name;
|
||||
guint64 addr;
|
||||
|
||||
if (!(jitmap = sysprof_capture_reader_read_jitmap (reader)))
|
||||
goto panic;
|
||||
|
||||
g_hash_table_iter_init (&iter, jitmap);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer *)&addr, (gpointer *)&name))
|
||||
{
|
||||
guint64 replace = sysprof_capture_writer_add_jitmap (self, name);
|
||||
/* We need to keep a table of replacement addresses so that
|
||||
* we can translate the samples into the destination address
|
||||
* space that we synthesized for the address identifier.
|
||||
*/
|
||||
translate_table_add (tables, TRANSLATE_ADDR, addr, replace);
|
||||
}
|
||||
|
||||
translate_table_sort (tables, TRANSLATE_ADDR);
|
||||
|
||||
g_hash_table_unref (jitmap);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SYSPROF_CAPTURE_FRAME_SAMPLE:
|
||||
{
|
||||
const SysprofCaptureSample *frame;
|
||||
@ -455,7 +466,17 @@ sysprof_capture_writer_cat (SysprofCaptureWriter *self,
|
||||
break;
|
||||
}
|
||||
|
||||
case SYSPROF_CAPTURE_FRAME_JITMAP:
|
||||
/* We already did this */
|
||||
if (!sysprof_capture_reader_skip (reader))
|
||||
goto panic;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Silently drop, which is better than looping. We could potentially
|
||||
* copy this over using the raw bytes at some point.
|
||||
*/
|
||||
sysprof_capture_reader_skip (reader);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user