From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17569 invoked by alias); 19 Jun 2008 19:52:32 -0000 Received: (qmail 17362 invoked by uid 367); 19 Jun 2008 19:52:29 -0000 Date: Thu, 19 Jun 2008 19:52:00 -0000 Message-ID: <20080619195229.17317.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Include VDSO in address map. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: bd2d28691caa79f3434474ae2bb1537b428aaf41 X-Git-Newrev: edfa23da73934bf0ab40697a13b0731feabb337c 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/msg00383.txt.bz2 The branch, master has been updated via edfa23da73934bf0ab40697a13b0731feabb337c (commit) from bd2d28691caa79f3434474ae2bb1537b428aaf41 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit edfa23da73934bf0ab40697a13b0731feabb337c Author: Andrew Cagney Date: Thu Jun 19 15:51:27 2008 -0400 Include VDSO in address map. frysk-sys/lib/dwfl/ChangeLog 2008-06-19 Andrew Cagney * cni/Dwfl.cxx (dwfl_frysk_proc_find_elf): Always set file_name so elfutils realises that the ELF was set. * jni/Dwfl.cxx: Ditto. * TestDwfl.java (testMapContainsVdso): Check the vdso's elf. * Dwfl.java (mapModule): Include segments starting with "[". ----------------------------------------------------------------------- Summary of changes: frysk-sys/lib/dwfl/ChangeLog | 6 +++++ frysk-sys/lib/dwfl/Dwfl.java | 5 +--- frysk-sys/lib/dwfl/TestDwfl.java | 3 +- frysk-sys/lib/dwfl/cni/Dwfl.cxx | 41 ++++++++++++--------------------- frysk-sys/lib/dwfl/cni/DwflModule.cxx | 21 +++++++--------- frysk-sys/lib/dwfl/jni/Dwfl.cxx | 19 +++++++-------- 6 files changed, 41 insertions(+), 54 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/lib/dwfl/ChangeLog b/frysk-sys/lib/dwfl/ChangeLog index f9e9ea0..43dc64a 100644 --- a/frysk-sys/lib/dwfl/ChangeLog +++ b/frysk-sys/lib/dwfl/ChangeLog @@ -1,5 +1,11 @@ 2008-06-19 Andrew Cagney + * cni/Dwfl.cxx (dwfl_frysk_proc_find_elf): Always set file_name so + elfutils realises that the ELF was set. + * jni/Dwfl.cxx: Ditto. + * TestDwfl.java (testMapContainsVdso): Check the vdso's elf. + * Dwfl.java (mapModule): Include segments starting with "[". + * DwflTestbed.java (createFromSelf()): Pass LocalMemory to the Dwfl. * cni/DwflModule.cxx (DwflModule::setUserData): Delete. * jni/DwflModule.cxx (DwflModule::setUserData): Delete. diff --git a/frysk-sys/lib/dwfl/Dwfl.java b/frysk-sys/lib/dwfl/Dwfl.java index ef77a05..f540e9f 100644 --- a/frysk-sys/lib/dwfl/Dwfl.java +++ b/frysk-sys/lib/dwfl/Dwfl.java @@ -266,10 +266,7 @@ public class Dwfl { finest.log(this, "ignoring empty name"); } else if (name.indexOf("(deleted") >= 0) { finest.log(this, "ignoring deleted", name); - } else if (!name.startsWith("/")) { - // XXX: This is too agressive, it ignores [vdso], on - // the other hand, if vdso is included this leads to - // segmentation faults. + } else if (!name.startsWith("/") && !name.equals("[vdso]")) { finest.log(this, "ignoring non-file", name); } else { // A new map, save it, will be reported later. diff --git a/frysk-sys/lib/dwfl/TestDwfl.java b/frysk-sys/lib/dwfl/TestDwfl.java index 2aee367..2d2bcc4 100644 --- a/frysk-sys/lib/dwfl/TestDwfl.java +++ b/frysk-sys/lib/dwfl/TestDwfl.java @@ -234,8 +234,6 @@ public class TestDwfl extends TestCase { } public void testMapContainsVdso() { - if (unresolved(6626)) - return; Dwfl dwfl = DwflTestbed.createFromSelf(); DwflModule[] modules = dwfl.getModules(); DwflModule vdso = null; @@ -248,5 +246,6 @@ public class TestDwfl extends TestCase { } } assertNotNull("vdso", vdso); + assertNotNull("elf", vdso.getElf()); } } diff --git a/frysk-sys/lib/dwfl/cni/Dwfl.cxx b/frysk-sys/lib/dwfl/cni/Dwfl.cxx index 167653d..e17af96 100644 --- a/frysk-sys/lib/dwfl/cni/Dwfl.cxx +++ b/frysk-sys/lib/dwfl/cni/Dwfl.cxx @@ -79,7 +79,6 @@ read_proc_memory (void *arg, void *data, GElf_Addr address, size_t minread, size_t maxread) { inua::eio::ByteBuffer* memory = (inua::eio::ByteBuffer *) arg; - jbyteArray bytes = JvNewByteArray(maxread); ssize_t nread = memory->safeGet((off64_t) address, bytes, 0, maxread); memcpy(data, elements(bytes), nread); @@ -94,34 +93,24 @@ dwfl_frysk_proc_find_elf (Dwfl_Module *mod, const char *module_name, Dwarf_Addr base, char **file_name, Elf **elfp) { - // There is an edge case here that was tripped by a corefile case. In that case the - // specified executable was defined as a relative path (ie ../foo/bar). And that is - // perfectly valid path name. However when the corefile created its maps it did not - // convert that path to an absolute path, causing the test below to fail and consider - // the file ../foo/bar to be an in memory elf image. - if (module_name[0] == '/') - { - int fd = open64 (module_name, O_RDONLY); - if (fd >= 0) - { - *file_name = strdup (module_name); - if (*file_name == NULL) - { - close (fd); - return ENOMEM; - } - } - return fd; - } - else - { + // There is an edge case here that was tripped by a corefile + // case. In that case the specified executable was defined as a + // relative path (ie ../foo/bar). And that is perfectly valid path + // name. However when the corefile created its maps it did not + // convert that path to an absolute path, causing the test below to + // fail and consider the file ../foo/bar to be an in memory elf + // image. + if (module_name[0] == '/') { + // Pass back the file name and let dwfl take care of the rest. + *file_name = strdup (module_name); + return -1; + } else { *elfp = elf_from_remote_memory (base, NULL, &read_proc_memory, *userdata); - + if (*elfp != NULL) { + *file_name = ::strdup(module_name); + } return -1; } - - //abort (); - return -1; } jlong diff --git a/frysk-sys/lib/dwfl/cni/DwflModule.cxx b/frysk-sys/lib/dwfl/cni/DwflModule.cxx index 5d7a41a..97892ff 100644 --- a/frysk-sys/lib/dwfl/cni/DwflModule.cxx +++ b/frysk-sys/lib/dwfl/cni/DwflModule.cxx @@ -68,18 +68,15 @@ #define DWFL_MODULE_POINTER ((Dwfl_Module *) pointer) lib::dwfl::ModuleElfBias* -lib::dwfl::DwflModule::module_getelf() -{ - Dwarf_Addr bias = 0; - ::Elf *elf = dwfl_module_getelf(DWFL_MODULE_POINTER, &bias); - if(elf == NULL) - return NULL; - - lib::dwfl::ModuleElfBias *ret = new lib::dwfl::ModuleElfBias(); - ret->elf = new lib::dwfl::Elf((jlong) elf); - ret->bias = (jlong) bias; - - return ret; +lib::dwfl::DwflModule::module_getelf() { + Dwarf_Addr bias = 0; + ::Elf *elf = dwfl_module_getelf(DWFL_MODULE_POINTER, &bias); + if(elf == NULL) + return NULL; + lib::dwfl::ModuleElfBias *ret = new lib::dwfl::ModuleElfBias(); + ret->elf = new lib::dwfl::Elf((jlong) elf); + ret->bias = (jlong) bias; + return ret; } typedef JArray DwflLineArray; diff --git a/frysk-sys/lib/dwfl/jni/Dwfl.cxx b/frysk-sys/lib/dwfl/jni/Dwfl.cxx index a04b9b8..7be62a5 100644 --- a/frysk-sys/lib/dwfl/jni/Dwfl.cxx +++ b/frysk-sys/lib/dwfl/jni/Dwfl.cxx @@ -107,21 +107,20 @@ dwfl_frysk_proc_find_elf(Dwfl_Module *mod, // that path to an absolute path, causing the test below to fail and // consider the file ../foo/bar to be an in memory elf image. if (module_name[0] == '/') { - int fd = ::open64(module_name, O_RDONLY); - if (fd >= 0) { - *file_name = ::strdup(module_name); - if (*file_name == NULL) { - ::close(fd); - return ENOMEM; - } - } - return fd; + // Return the file name, and then let elfutils decide what to do. + *file_name = ::strdup(module_name); + return -1; } else { // dwfl passes in the address of the Dwfl_Module user pointer // contained within. That pointer has been previously stuffed // with our "userdata". *elfp = elf_from_remote_memory (base, NULL, &read_proc_memory, *userdata); - return 0; + if (*elfp != NULL) { + // Poke something into FILE_NAME so that the caller notices that + // we've done something to ELF. + *file_name = ::strdup(module_name); + } + return -1; } } hooks/post-receive -- frysk system monitor/debugger