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>
+
* collector.c (resolve_symbols): Combine processes with identical
commandlines here.
- etc.
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.
* Make it compile and work on x86-64
Probably better to send a list of maps with each trace. Which
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
- 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
drawing. (google's script is really simple; uses dot from graphviz).
- 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.
- What function is doing all the synchronous reading, and what files/offsets is
-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 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.
* Add "sysprof --version"
typedef struct SysprofStackInfo SysprofStackInfo;
typedef struct SysprofMmapArea SysprofMmapArea;
-#define SYSPROF_N_TRACES 256
-#define SYSPROF_MAX_ADDRESSES 512
+#define SYSPROF_N_TRACES 64
+#define SYSPROF_MAX_ADDRESSES 1021 /* to make it one page wide */
struct SysprofStackTrace
{
struct SysprofMmapArea
{
- unsigned int head;
-
SysprofStackTrace traces[SYSPROF_N_TRACES];
+
+ unsigned int head;
};
#endif
struct Process
{
- char *cmdline;
+ char * cmdline;
- int n_maps;
- Map *maps;
+ int n_maps;
+ Map * maps;
- GList *bad_pages;
+ GList * bad_pages;
- int pid;
+ int pid;
const char *undefined;
};
char *stat;
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))
{
char result[200];
if (sscanf (stat, "%*d %200s %*s", result) == 1)
return g_strndup (result, 200);
}
-#if 0
- g_print ("return null\n");
-#endif
return NULL;
}
}
ProfileCaller *
-profile_list_callers (Profile *profile,
- char *callee_name)
+profile_list_callers (Profile *profile,
+ char *callee_name)
{
StackNode *node;
StackNode *callees;
for (node = callees; node != NULL; node = node->next)
{
+ ProfileCaller *caller;
+
if (!node->parent)
continue;
- ProfileCaller *caller =
- g_hash_table_lookup (callers_by_name, node->parent->address);
+ caller = g_hash_table_lookup (callers_by_name, node->parent->address);
if (!caller)
{