I thought I'd try if memprof worked with x86-64, but looks like it doesn't. Attached is a patch that fixes the obvious things in case someone else wants to try to fix it to actually work. There are also some other fixes for compiler warnings.
diff -ru memprof-0.6/bfdutils.c memprof-0.6-64/bfdutils.c --- memprof-0.6/bfdutils.c 2006-07-28 04:26:41.000000000 +0300 +++ memprof-0.6-64/bfdutils.c 2007-06-18 12:37:45.658732218 +0300 @@ -183,7 +183,7 @@ { unsigned long file_crc = 0; int fd; - char buffer[8*1024]; + unsigned char buffer[8*1024]; int count; fd = open (name, O_RDONLY); diff -ru memprof-0.6/intercept.c memprof-0.6-64/intercept.c --- memprof-0.6/intercept.c 2006-07-28 04:26:10.000000000 +0300 +++ memprof-0.6-64/intercept.c 2007-06-18 12:48:21.709250588 +0300 @@ -346,7 +346,7 @@ ThreadInfo *thread; int old_errno = errno; - if (n_frames < 0) + if (n_frames < 0 || n_frames > 10000) { MI_DEBUG (("mi_write_stack - elide bogus foo\n")); return; diff -ru memprof-0.6/leakdetect.c memprof-0.6-64/leakdetect.c --- memprof-0.6/leakdetect.c 2004-09-13 22:01:52.000000000 +0300 +++ memprof-0.6-64/leakdetect.c 2007-06-18 12:40:45.169289643 +0300 @@ -57,7 +57,7 @@ } static gboolean -read_proc_stat (int pid, char *status, guint *start_stack, guint *end_stack) +read_proc_stat (int pid, char *status, gsize *start_stack, gsize *end_stack) { gchar *fname; gulong tstart_stack; @@ -204,7 +204,7 @@ GList *map_list) { GList *tmp_list; - guint start_stack, end_stack; + gsize start_stack, end_stack; tmp_list = map_list; @@ -365,7 +365,7 @@ &mem[i]); if (errno) { - g_warning ("Cannot read word %d/%d in block %p: %s\n", + g_warning ("Cannot read word %d/%ld in block %p: %s\n", i, length, block->addr, g_strerror (errno)); g_free (addr); return block_list; diff -ru memprof-0.6/memprof.h memprof-0.6-64/memprof.h --- memprof-0.6/memprof.h 2004-09-11 03:35:19.000000000 +0300 +++ memprof-0.6-64/memprof.h 2007-06-18 12:38:27.324093705 +0300 @@ -46,7 +46,7 @@ typedef struct { /* Initial members of this struct must be identical to that of Symbol */ - guint addr; + gsize addr; guint size; gchar *name; bfd *abfd; @@ -59,7 +59,7 @@ } Map; typedef struct { - guint addr; + gsize addr; guint size; gchar *name; } Symbol; diff -ru memprof-0.6/mi-perfctr.c memprof-0.6-64/mi-perfctr.c --- memprof-0.6/mi-perfctr.c 2002-09-05 22:16:38.000000000 +0300 +++ memprof-0.6-64/mi-perfctr.c 2007-06-18 12:32:30.886001384 +0300 @@ -61,10 +61,14 @@ info.alloc.old_ptr = NULL; info.alloc.new_ptr = NULL; info.alloc.size = 1; - + +#ifdef __x86_64__ + mi_call_with_signal_backtrace ((void *)ctx->rip, (void *)ctx->rbp, (void *)ctx->rsp, + mi_write_stack, &info); +#else mi_call_with_signal_backtrace ((void *)ctx->eip, (void *)ctx->ebp, (void *)ctx->esp, mi_write_stack, &info); - +#endif if (ioctl (perfctr_fd, VPERFCTR_IRESUME) < 0) mi_perror ("Error restarting handler interrupt"); diff -ru memprof-0.6/process.c memprof-0.6-64/process.c --- memprof-0.6/process.c 2006-07-28 04:26:10.000000000 +0300 +++ memprof-0.6-64/process.c 2007-06-18 12:39:48.143794893 +0300 @@ -176,7 +176,8 @@ FILE *in; gchar perms[26]; gchar file[256]; - guint start, end, major, minor, inode; + gsize start, end; + guint major, minor, inode; snprintf (buffer, 1023, "/proc/%d/maps", process->pid); @@ -190,7 +191,7 @@ } while (fgets(buffer, 1023, in)) { - int count = sscanf (buffer, "%x-%x %15s %*x %x:%x %u %255s", + int count = sscanf (buffer, "%lx-%lx %15s %*x %x:%x %u %255s", &start, &end, perms, &major, &minor, &inode, file); if (count >= 6) { if (strcmp (perms, "r-xp") == 0) { @@ -242,7 +243,7 @@ } static Map * -real_locate_map (MPProcess *process, guint addr) +real_locate_map (MPProcess *process, gsize addr) { GList *tmp_list = process->map_list; @@ -260,8 +261,8 @@ return NULL; } -Map * -locate_map (MPProcess *process, guint addr) +static Map * +locate_map (MPProcess *process, gsize addr) { Map *map = real_locate_map (process, addr); if (!map) @@ -287,12 +288,12 @@ } const Symbol * -process_locate_symbol (MPProcess *process, guint addr) +process_locate_symbol (MPProcess *process, gsize addr) { Symbol *data; Map *map; - guint first, middle, last; + gsize first, middle, last; map = locate_map (process, addr); if (!map) @@ -348,7 +349,7 @@ const char **filename, char **functionname, unsigned int *line) { - Map *map = locate_map (process, (guint)address); + Map *map = locate_map (process, (gsize)address); if (map) { bfd_vma addr = (bfd_vma)address; if (map->do_offset) @@ -595,7 +596,7 @@ gpointer data) { MIInfo info; - guint count; + gsize count; MPProcess *input_process = data; MPProcess *process = NULL; @@ -933,7 +934,7 @@ char *fname; char *result; char *tmp = NULL; - int n = 0; + size_t n = 0; FILE *in = NULL; if (process->status == MP_PROCESS_DEFUNCT) diff -ru memprof-0.6/process.h memprof-0.6-64/process.h --- memprof-0.6/process.h 2003-12-19 01:04:30.000000000 +0200 +++ memprof-0.6-64/process.h 2007-06-18 12:35:08.244366542 +0300 @@ -131,7 +131,7 @@ FILE *out, StackElement *stack); const Symbol *process_locate_symbol (MPProcess *process, - guint addr); + gsize addr); char ** process_parse_exec (const char *exec_string); char * process_find_exec (char **args); diff -ru memprof-0.6/profile.c memprof-0.6-64/profile.c --- memprof-0.6/profile.c 2004-01-23 13:22:01.000000000 +0200 +++ memprof-0.6-64/profile.c 2007-06-18 12:41:03.706450472 +0300 @@ -29,7 +29,7 @@ for (element = block->stack; !STACK_ELEMENT_IS_ROOT (element); element = element->parent) { - const Symbol *symbol = process_locate_symbol (process, (guint)element->address); + const Symbol *symbol = process_locate_symbol (process, (gsize)element->address); if (symbol && symbol->name && g_hash_table_lookup (skip_hash, symbol->name)) continue; @@ -54,7 +54,7 @@ StackElement *element = list->data; ProfileNode *match = NULL; const Symbol *symbol = - process_locate_symbol (profile->process, (guint)element->address); + process_locate_symbol (profile->process, (gsize)element->address); int i; for (i = 0; i < roots->len; ++i) diff -ru memprof-0.6/server.c memprof-0.6-64/server.c --- memprof-0.6/server.c 2006-07-28 04:26:10.000000000 +0300 +++ memprof-0.6-64/server.c 2007-06-18 12:41:21.483604705 +0300 @@ -182,7 +182,7 @@ g_hash_table_destroy (server->pid_table); close (server->socket_fd); - g_slist_remove (socket_paths, server->socket_path); + socket_paths = g_slist_remove (socket_paths, server->socket_path); g_free (server->socket_path); } --- memprof-0.6/speedintercept.c 2006-07-28 04:26:10.000000000 +0300 +++ memprof-0.6-64/speedintercept.c 2007-06-18 12:54:49.524680864 +0300 @@ -155,13 +155,10 @@ #define SIGHANDLER_FRAMES 2 static void -#if defined (__linux__) && defined (__i386__) -sigprof_handler (int unused, struct sigcontext ctx) -#else -sigprof_handler (int unused) -#endif +sigprof_handler (int unused, siginfo_t *si, ucontext_t *ucontext) { int saved_errno = errno; + struct sigcontext *ctx = (struct sigcontext *)&ucontext->uc_mcontext; MIInfo info; info.alloc.operation = MI_TIME; @@ -169,11 +166,14 @@ info.alloc.new_ptr = NULL; info.alloc.size = 1; -#if defined (__linux__) && defined (__i386__) - mi_call_with_signal_backtrace ((void *)ctx.eip, (void *)ctx.ebp, (void *)ctx.esp, +#ifdef __x86_64__ + mi_call_with_signal_backtrace ((void *)ctx->rip, (void *)ctx->rbp, (void *)ctx->rsp, + mi_write_stack, &info); +#elif defined (__i386__) + mi_call_with_signal_backtrace ((void *)ctx->eip, (void *)ctx->ebp, (void *)ctx->esp, mi_write_stack, &info); #else - mi_call_with_backtrace (SIGHANDLER_FRAMES, saved_pc, mi_write_stack, &info); + mi_call_with_backtrace (SIGHANDLER_FRAMES, mi_write_stack, &info); #endif if (profile_type == SPEED_PROF_ITIMER) diff -ru memprof-0.6/stack-frame.c memprof-0.6-64/stack-frame.c --- memprof-0.6/stack-frame.c 2006-07-28 04:26:10.000000000 +0300 +++ memprof-0.6-64/stack-frame.c 2007-06-18 12:23:38.815385498 +0300 @@ -72,7 +72,7 @@ #define HAVE_FRAME_ACCESSORS -#if defined (__GNUC__) && defined (__i386__) +#if defined (__GNUC__) typedef struct stack_frame_struct stack_frame; struct stack_frame_struct { stack_frame *next;
Attachment:
signature.asc
Description: This is a digitally signed message part