From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24270 invoked by alias); 24 May 2008 20:47:58 -0000 Received: (qmail 24242 invoked by uid 367); 24 May 2008 20:47:57 -0000 Date: Sat, 24 May 2008 20:47:00 -0000 Message-ID: <20080524204757.24227.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Immediatly unmap the unwind-info image when notified its free by libunwind. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 9e513ef98a772fee06a688072310aad9011494dc X-Git-Newrev: 68021418975e2fa86f8189b61f67f437796a9b96 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00284.txt.bz2 The branch, master has been updated via 68021418975e2fa86f8189b61f67f437796a9b96 (commit) from 9e513ef98a772fee06a688072310aad9011494dc (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 68021418975e2fa86f8189b61f67f437796a9b96 Author: Andrew Cagney Date: Sat May 24 16:47:08 2008 -0400 Immediatly unmap the unwind-info image when notified its free by libunwind. This leverages a change to libunwind to notify the eh-frame supplier that libunwind's dwarf code has finished using the information. When so notified the eh-frame data image is freed; previously the code was relying on the garbage collector to release this memory. frysk-sys/lib/unwind/ChangeLog 2008-05-24 Andrew Cagney * cni/UnwindH.hxx (image_put_unwind_info): New. (struct image): New. (fillProcInfoFromImage): Create an image and pass to unw_get_unwind_table. 2008-05-24 Andrew Cagney * NEWS: Mention reduced memory footprint. ----------------------------------------------------------------------- Summary of changes: NEWS | 14 ++++--- frysk-sys/lib/unwind/ChangeLog | 5 ++ frysk-sys/lib/unwind/cni/UnwindH.hxx | 78 ++++++++++++++++++++++----------- frysk-top/ChangeLog | 4 ++ 4 files changed, 69 insertions(+), 32 deletions(-) First 500 lines of diff: diff --git a/NEWS b/NEWS index e3f0e39..f980797 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,14 @@ multi-process, and multi-threaded systems while they are running. -- +Release 0.4, ????-??-?? + +-> Smaller memory foot-print when generating stack backtraces. + Frysk has been changed to more aggressively release memory + allocated by the unwinder. + +-- + Release 0.3, 2008-05-09 - Exported a prototype of low level watchpoint api on IA32,X8664 @@ -29,18 +37,12 @@ Release 0.3, 2008-05-09 - Imported a newer version of upstream elfutils. - Fixed breakpoints to work correctly through forks. --- - -Post-Release 0.2 Updates: - -> 2004-04-24 - New support in FHPD: sysroot Frysk now also supports finding libraries in a special system directory heirarchy as well as the previously supported source files and debuginfo files. This is specified via the -sysroot option. --- - -> 2004-04-16 - New command in FHPD: watch Use to set watchpoints on expressions or variables. This stops diff --git a/frysk-sys/lib/unwind/ChangeLog b/frysk-sys/lib/unwind/ChangeLog index 4c93d20..f8dd2a1 100644 --- a/frysk-sys/lib/unwind/ChangeLog +++ b/frysk-sys/lib/unwind/ChangeLog @@ -1,5 +1,10 @@ 2008-05-24 Andrew Cagney + * cni/UnwindH.hxx (image_put_unwind_info): New. + (struct image): New. + (fillProcInfoFromImage): Create an image and pass to + unw_get_unwind_table. + * Unwind.java (createElfImageFromVDSO): Delete. (createProcInfoFromElfImage): Delete. (fillProcInfoFromVDSO): New. diff --git a/frysk-sys/lib/unwind/cni/UnwindH.hxx b/frysk-sys/lib/unwind/cni/UnwindH.hxx index dda792f..1b55b66 100644 --- a/frysk-sys/lib/unwind/cni/UnwindH.hxx +++ b/frysk-sys/lib/unwind/cni/UnwindH.hxx @@ -587,25 +587,48 @@ get_eh_frame_hdr_addr(unw_proc_info_t *pi, char *image, size_t size, /** * The following are local memory image address space memory accessors - * used by unw_get_unwind_table to access the eh_frame_hdr. The arg - * pointer is the base address, addr is the offset from the base - * address. + * used by unw_get_unwind_table and run_cfi_program to access and + * interpret the eh_frame_hdr. The arg pointer contains an image + * descriptor, ADDR is the offset into the eh-frame table within the + * image. */ +struct image { + int magic; + void *bytes; + size_t size; + char *table; +}; +const int IMAGE_MAGIC = 0xfeed; static int image_access_mem(unw_addr_space_t as, unw_word_t addr, - unw_word_t *val, int write, void *baseAddress) { + unw_word_t *val, int write, void *arg) { + struct image *image = (struct image*) arg; + if (image->magic != IMAGE_MAGIC) { + throw new RuntimeException(JvNewStringUTF("bad image magic number")); + } // Writing is not supported if (write) return -UNW_EINVAL; else - *val = *(unw_word_t *) ((char *)baseAddress + addr); - + *val = *(unw_word_t *) (image->table + addr); return UNW_ESUCCESS; } +static void +image_put_unwind_info(::unw_addr_space_t as, ::unw_proc_info_t *proc_info, + void *arg) { + struct image *image = (struct image*) arg; + if (image->magic != IMAGE_MAGIC) { + fprintf(stderr, "corrupt image pointer\n"); + throw new RuntimeException(JvNewStringUTF("bad image magic number")); + } + munmap(image->bytes, image->size); + ::free(image); +} + static unw_accessors_t image_accessors = { - NULL, NULL, NULL, image_access_mem, NULL, NULL, NULL, NULL + NULL, image_put_unwind_info, NULL, image_access_mem, NULL, NULL, NULL, NULL }; static jint @@ -614,36 +637,47 @@ fillProcInfoFromImage(frysk::rsl::Log* fine, jlong unwProcInfo, jlong ip, jboolean needUnwindInfo, - void *image, + void *bytes, long size, long segbase) { unw_proc_info_t *procInfo = (::unw_proc_info_t *) unwProcInfo; logf(fine, "fillProcInfoFromImage" - " %s unwProcInfo %lx, ip %lx, image %p, size %ld, segBase %lx", - name, (long) unwProcInfo, (long)ip, image, size, segbase); + " %s unwProcInfo %lx, ip %lx, bytes %p, size %ld, segBase %lx", + name, (long) unwProcInfo, (long)ip, bytes, size, segbase); unw_word_t peh_vaddr = 0; char *eh_table_hdr = get_eh_frame_hdr_addr(procInfo, - (char *) image, + (char *) bytes, size, segbase, &peh_vaddr); if (eh_table_hdr == NULL) { logf(fine, "get_eh_frame_hdr failed"); - munmap(image, size); + munmap(bytes, size); + return -UNW_ENOINFO; + } + + struct image *image = new struct image(); + if (image == NULL) { + munmap(bytes, size); return -UNW_ENOINFO; } + image->magic = IMAGE_MAGIC; + image->bytes = bytes; + image->size = size; int ret; - if (procInfo->format == UNW_INFO_FORMAT_REMOTE_TABLE) + if (procInfo->format == UNW_INFO_FORMAT_REMOTE_TABLE) { + // address adjustment + image->table = eh_table_hdr - peh_vaddr; ret = unw_get_unwind_table((unw_word_t) ip, procInfo, (int) needUnwindInfo, &image_accessors, // virtual address peh_vaddr, - // address adjustment - eh_table_hdr - peh_vaddr); - else + image); + } else { + image->table = eh_table_hdr; ret = unw_get_unwind_table((unw_word_t) ip, procInfo, (int) needUnwindInfo, @@ -651,16 +685,8 @@ fillProcInfoFromImage(frysk::rsl::Log* fine, // virtual address 0, // address adjustment - eh_table_hdr); - - // FIXME: The munmap can't be done until after the step code has - // finished with the proc-info. For moment ack around this by - // creating an ElfImage object that does the unmap in the finaliser. - // Of course this A) leaves many mmaped objects around; and B) has a - // race where the object could be unmapped before step has finished - // with it. - new ElfImage((jlong) image, (jlong) size); - // munmap(image, size); + image); + } logf(fine, "Post unw_get_unwind_table %d", ret); return ret; } diff --git a/frysk-top/ChangeLog b/frysk-top/ChangeLog index 243104d..1eb6691 100644 --- a/frysk-top/ChangeLog +++ b/frysk-top/ChangeLog @@ -1,3 +1,7 @@ +2008-05-24 Andrew Cagney + + * NEWS: Mention reduced memory footprint. + 2008-05-12 Rick Moseley * Update NEWS file for release 0.3. hooks/post-receive -- frysk system monitor/debugger