Increase the max number of addresses to 1021, reorganise SysprofMmapArea

2006-10-26  Soren Sandmann <sandmann@daimi.au.dk>

        * module/sysprof-module.h (struct SysprofStackTrace): Increase the
        max number of addresses to 1021, reorganise SysprofMmapArea to
        make the traces naturally page aligned.

        * TODO: Update
This commit is contained in:
Soren Sandmann
2006-11-02 06:54:12 +00:00
committed by Søren Sandmann Pedersen
parent e7415d4492
commit 9a1ed3d336
6 changed files with 50 additions and 28 deletions

View File

@ -1,3 +1,11 @@
2006-10-26 Soren Sandmann <sandmann@daimi.au.dk>
* module/sysprof-module.h (struct SysprofStackTrace): Increase the
max number of addresses to 1021, reorganise SysprofMmapArea to
make the traces naturally page aligned.
* TODO: Update
2006-10-26 Soren Sandmann <sandmann@daimi.au.dk> 2006-10-26 Soren Sandmann <sandmann@daimi.au.dk>
* collector.c (resolve_symbols): Combine processes with identical * collector.c (resolve_symbols): Combine processes with identical

33
TODO
View File

@ -158,11 +158,6 @@ Before 1.2:
- etc. - etc.
done: HEAD will not load files with the wrong inode now. done: HEAD will not load files with the wrong inode now.
* Consider deleting cmdline hack in process.c and replace with something at
the symbol resolution level. Will require more memory though. DONE: in
head, processes are no longer coalesced based on cmdline. Need to add something
at the symbol level.
* Add spew infrastructure to make remote debugging easier. * Add spew infrastructure to make remote debugging easier.
* Make it compile and work on x86-64 * Make it compile and work on x86-64
@ -437,6 +432,26 @@ http://www.linuxbase.org/spec/booksets/LSB-Embedded/LSB-Embedded/ehframe.html
shouldn't really be that expensive. We already walk the list of shouldn't really be that expensive. We already walk the list of
maps in process_ensure_map() on every trace. And we can do hashing maps in process_ensure_map() on every trace. And we can do hashing
if it turns out to be a problem. if it turns out to be a problem.
Maybe replace the SysprofStackTrace with a union, so that
it can be either a list of maps, or a stacktrace. Both map lists and
stacktraces would come with a hashcode.allowing userspac. This avoids
the problem that maps could take up a lot of extra bandwidth.
struct MapInfo
{
long start;
long end;
long offset;
long inode;
}
struct Maps
{
int hash_code;
int n_maps;
MapInfo info [127];
char filenames [2048];
}
- Figure out how Google's pprof script works. Then add real call graph - Figure out how Google's pprof script works. Then add real call graph
drawing. (google's script is really simple; uses dot from graphviz). drawing. (google's script is really simple; uses dot from graphviz).
@ -620,7 +635,8 @@ Later:
- Optimization usecases: - Optimization usecases:
- A lot of stuff is read synchronously, but it is possible to read it asynchronously. - A lot of stuff is read synchronously, but it is possible to read
it asynchronously.
Visualization: A timeline with alternating CPU/disk activity. Visualization: A timeline with alternating CPU/disk activity.
- What function is doing all the synchronous reading, and what files/offsets is - What function is doing all the synchronous reading, and what files/offsets is
@ -667,6 +683,11 @@ Later:
-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ALREADY DONE -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -=-=-=-=-=-=-=-=-=-=-=-=-=-=- ALREADY DONE -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* Consider deleting cmdline hack in process.c and replace with something at
the symbol resolution level. Will require more memory though. DONE: in
head, processes are no longer coalesced based on cmdline. Need to add something
at the symbol level.
* don't loop infinitely if there are cycles in the debuglink graph. * don't loop infinitely if there are cycles in the debuglink graph.
* Add "sysprof --version" * Add "sysprof --version"

View File

@ -24,8 +24,8 @@ typedef struct SysprofStackTrace SysprofStackTrace;
typedef struct SysprofStackInfo SysprofStackInfo; typedef struct SysprofStackInfo SysprofStackInfo;
typedef struct SysprofMmapArea SysprofMmapArea; typedef struct SysprofMmapArea SysprofMmapArea;
#define SYSPROF_N_TRACES 256 #define SYSPROF_N_TRACES 64
#define SYSPROF_MAX_ADDRESSES 512 #define SYSPROF_MAX_ADDRESSES 1021 /* to make it one page wide */
struct SysprofStackTrace struct SysprofStackTrace
{ {
@ -39,9 +39,9 @@ struct SysprofStackTrace
struct SysprofMmapArea struct SysprofMmapArea
{ {
unsigned int head;
SysprofStackTrace traces[SYSPROF_N_TRACES]; SysprofStackTrace traces[SYSPROF_N_TRACES];
unsigned int head;
}; };
#endif #endif

View File

@ -49,14 +49,14 @@ struct Map
struct Process struct Process
{ {
char *cmdline; char * cmdline;
int n_maps; int n_maps;
Map *maps; Map * maps;
GList *bad_pages; GList * bad_pages;
int pid; int pid;
const char *undefined; const char *undefined;
}; };
@ -352,10 +352,6 @@ get_statname (int pid)
char *stat; char *stat;
char *filename = idle_free (g_strdup_printf ("/proc/%d/stat", pid)); char *filename = idle_free (g_strdup_printf ("/proc/%d/stat", pid));
#if 0
g_print ("stat %d\n", pid);
#endif
if (g_file_get_contents (filename, &stat, NULL, NULL)) if (g_file_get_contents (filename, &stat, NULL, NULL))
{ {
char result[200]; char result[200];
@ -365,9 +361,6 @@ get_statname (int pid)
if (sscanf (stat, "%*d %200s %*s", result) == 1) if (sscanf (stat, "%*d %200s %*s", result) == 1)
return g_strndup (result, 200); return g_strndup (result, 200);
} }
#if 0
g_print ("return null\n");
#endif
return NULL; return NULL;
} }

View File

@ -363,8 +363,8 @@ profile_caller_new (void)
} }
ProfileCaller * ProfileCaller *
profile_list_callers (Profile *profile, profile_list_callers (Profile *profile,
char *callee_name) char *callee_name)
{ {
StackNode *node; StackNode *node;
StackNode *callees; StackNode *callees;
@ -379,11 +379,12 @@ profile_list_callers (Profile *profile,
for (node = callees; node != NULL; node = node->next) for (node = callees; node != NULL; node = node->next)
{ {
ProfileCaller *caller;
if (!node->parent) if (!node->parent)
continue; continue;
ProfileCaller *caller = caller = g_hash_table_lookup (callers_by_name, node->parent->address);
g_hash_table_lookup (callers_by_name, node->parent->address);
if (!caller) if (!caller)
{ {

View File

@ -757,7 +757,6 @@ overwrite_file (GtkWindow *window,
gtk_widget_destroy (msgbox); gtk_widget_destroy (msgbox);
return (ret == GTK_RESPONSE_YES); return (ret == GTK_RESPONSE_YES);
} }
static void static void