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

35
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
@ -436,7 +431,27 @@ http://www.linuxbase.org/spec/booksets/LSB-Embedded/LSB-Embedded/ehframe.html
Probably better to send a list of maps with each trace. Which Probably better to send a list of maps with each trace. Which
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