From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32588 invoked by alias); 19 Jun 2008 17:42:20 -0000 Received: (qmail 32561 invoked by uid 367); 19 Jun 2008 17:42:20 -0000 Date: Thu, 19 Jun 2008 17:42:00 -0000 Message-ID: <20080619174220.32546.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Add test for [vdso], fail for moment. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: a0d0cc59f7dcc4377aee0568bcc4b890e8b55e6b X-Git-Newrev: 5c0013016a63729e15b30738625df8f21e1bfd51 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/msg00381.txt.bz2 The branch, master has been updated via 5c0013016a63729e15b30738625df8f21e1bfd51 (commit) from a0d0cc59f7dcc4377aee0568bcc4b890e8b55e6b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 5c0013016a63729e15b30738625df8f21e1bfd51 Author: Andrew Cagney Date: Thu Jun 19 13:41:00 2008 -0400 Add test for [vdso], fail for moment. frysk-sys/frysk/rsl/ChangeLog 2008-06-19 Andrew Cagney * Log.java: Add more methods. frysk-sys/frysk/testbed/ChangeLog 2008-06-19 Andrew Cagney * TestLocalMemory.java (testMemoryByteBuffer()): New. * LocalMemory.java (getByteBuffer()): New. * jni/LocalMemory.cxx (LocalMemory::peek): Implement. * cni/LocalMemory.cxx (LocalMemory::peek): Implement. frysk-sys/lib/dwfl/ChangeLog 2008-06-19 Andrew Cagney * Dwfl.java (mapModule): Correctly add maps such as [vdso]. * TestDwfl.java (testMapContainsVdso()): New. * DwflTestbed.java (VdsoBuilder): Delete. (createFromSelf()): Don't pass in the vdso. ----------------------------------------------------------------------- Summary of changes: frysk-sys/frysk/rsl/ChangeLog | 4 ++ frysk-sys/frysk/rsl/Log.java | 7 ++++ frysk-sys/frysk/testbed/ChangeLog | 7 ++++ frysk-sys/frysk/testbed/LocalMemory.java | 19 +++++++++++ frysk-sys/frysk/testbed/TestLocalMemory.java | 15 ++++++-- frysk-sys/frysk/testbed/cni/LocalMemory.cxx | 7 +++- frysk-sys/frysk/testbed/jni/LocalMemory.cxx | 5 +++ frysk-sys/lib/dwfl/ChangeLog | 7 ++++ frysk-sys/lib/dwfl/Dwfl.java | 45 +++++++++++++++---------- frysk-sys/lib/dwfl/DwflTestbed.java | 19 +---------- frysk-sys/lib/dwfl/TestDwfl.java | 17 ++++++++++ frysk-sys/lib/dwfl/cni/Dwfl.cxx | 8 ++-- frysk-sys/lib/dwfl/jni/Dwfl.cxx | 8 ++-- 13 files changed, 119 insertions(+), 49 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/frysk/rsl/ChangeLog b/frysk-sys/frysk/rsl/ChangeLog index f611e11..a37407d 100644 --- a/frysk-sys/frysk/rsl/ChangeLog +++ b/frysk-sys/frysk/rsl/ChangeLog @@ -1,3 +1,7 @@ +2008-06-19 Andrew Cagney + + * Log.java: Add more methods. + 2008-06-04 Andrew Cagney * Log.java (finest(Class)): New. diff --git a/frysk-sys/frysk/rsl/Log.java b/frysk-sys/frysk/rsl/Log.java index 1557332..27f1245 100644 --- a/frysk-sys/frysk/rsl/Log.java +++ b/frysk-sys/frysk/rsl/Log.java @@ -421,6 +421,13 @@ public final class Log { prefix(self).print(p1).print(p2).print(p3).print(p4).print(p5).print(p6).print(p7).print(p8).print(p9).print(p10).print(p11).suffix(); } + // dynamic 12 parameters + public void log(Object self, String p1, Object p2, String p3, long p4, String p5, long p6, String p7, int p8, String p9, int p10, String p11, int p12) { + if (!logging) + return; + prefix(self).print(p1).print(p2).print(p3).print(p4).print(p5).print(p6).print(p7).print(p8).print(p9).print(p10).print(p11).print(p12).suffix(); + } + /** * Assuming the use: log("caller", log.CALLER) prints the diff --git a/frysk-sys/frysk/testbed/ChangeLog b/frysk-sys/frysk/testbed/ChangeLog index ff3c2a9..136395e 100644 --- a/frysk-sys/frysk/testbed/ChangeLog +++ b/frysk-sys/frysk/testbed/ChangeLog @@ -1,3 +1,10 @@ +2008-06-19 Andrew Cagney + + * TestLocalMemory.java (testMemoryByteBuffer()): New. + * LocalMemory.java (getByteBuffer()): New. + * jni/LocalMemory.cxx (LocalMemory::peek): Implement. + * cni/LocalMemory.cxx (LocalMemory::peek): Implement. + 2008-06-12 Andrew Cagney * TearDownExpect.java (TearDownExpect()): Add. diff --git a/frysk-sys/frysk/testbed/LocalMemory.java b/frysk-sys/frysk/testbed/LocalMemory.java index c79f331..fdb0eaa 100644 --- a/frysk-sys/frysk/testbed/LocalMemory.java +++ b/frysk-sys/frysk/testbed/LocalMemory.java @@ -39,6 +39,9 @@ package frysk.testbed; +import inua.eio.ByteBuffer; +import frysk.sys.ptrace.AddressSpace; + /** * Provide access to known local areas of memory. * @@ -102,4 +105,20 @@ public class LocalMemory { * will be so large that it is negative. */ public static native void constructStack(StackBuilder builder); + + /** + * Return a byte-buffer capable of reading any address of this + * thread's memory. + */ + public static ByteBuffer getByteBuffer() { + return new ByteBuffer(0, AddressSpace.DATA.length()) { + protected int peek(long offset) { + return LocalMemory.peek(offset); + } + protected void poke(long offset, int b) { + // do nothing + } + }; + } + private static native int peek(long addr); } diff --git a/frysk-sys/frysk/testbed/TestLocalMemory.java b/frysk-sys/frysk/testbed/TestLocalMemory.java index f378d55..4d4447c 100644 --- a/frysk-sys/frysk/testbed/TestLocalMemory.java +++ b/frysk-sys/frysk/testbed/TestLocalMemory.java @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2007, Red Hat Inc. +// Copyright 2007, 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -40,13 +40,12 @@ package frysk.testbed; import frysk.junit.TestCase; +import inua.eio.ByteBuffer; /** * Check that LocalMemory addresses are pointing where expected. */ -public class TestLocalMemory - extends TestCase -{ +public class TestLocalMemory extends TestCase { /** * Check that the stack address changes as new stack frames are * created. @@ -96,4 +95,12 @@ public class TestLocalMemory byte[] bytes = LocalMemory.getDataBytes(); assertEquals("data byte[0]", 43, bytes[0]); } + + + public void testMemoryByteBuffer() { + ByteBuffer memory = LocalMemory.getByteBuffer(); + assertEquals("data", LocalMemory.getDataBytes()[0], + memory.get(LocalMemory.getDataAddr())); + } + } diff --git a/frysk-sys/frysk/testbed/cni/LocalMemory.cxx b/frysk-sys/frysk/testbed/cni/LocalMemory.cxx index f2944ea..8afd4af 100644 --- a/frysk-sys/frysk/testbed/cni/LocalMemory.cxx +++ b/frysk-sys/frysk/testbed/cni/LocalMemory.cxx @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2005, 2006, 2007, 2008 Red Hat Inc. +// Copyright 2005, 2006, 2007, 2008, 2008 Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -130,3 +130,8 @@ LocalMemory::getModuleName() { // be deleted. return JvNewStringUTF("TestRunner"); } + +jint +LocalMemory::peek(jlong addr) { + return *(unsigned char*)addr; +} diff --git a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx index 840e129..9324cf2 100644 --- a/frysk-sys/frysk/testbed/jni/LocalMemory.cxx +++ b/frysk-sys/frysk/testbed/jni/LocalMemory.cxx @@ -127,3 +127,8 @@ String LocalMemory::getModuleName(::jnixx::env env) { return String::NewStringUTF(env, "libfrysk-sys-jni.so"); } + +jint +LocalMemory::peek(::jnixx::env env, jlong addr) { + return *(unsigned char*)addr; +} diff --git a/frysk-sys/lib/dwfl/ChangeLog b/frysk-sys/lib/dwfl/ChangeLog index 6e7a384..692ac0d 100644 --- a/frysk-sys/lib/dwfl/ChangeLog +++ b/frysk-sys/lib/dwfl/ChangeLog @@ -1,3 +1,10 @@ +2008-06-19 Andrew Cagney + + * Dwfl.java (mapModule): Correctly add maps such as [vdso]. + * TestDwfl.java (testMapContainsVdso()): New. + * DwflTestbed.java (VdsoBuilder): Delete. + (createFromSelf()): Don't pass in the vdso. + 2008-06-16 Andrew Cagney * DwflModule.java (get_cu_dies): Add pointer parameter. diff --git a/frysk-sys/lib/dwfl/Dwfl.java b/frysk-sys/lib/dwfl/Dwfl.java index 9e9ef82..cba6ede 100644 --- a/frysk-sys/lib/dwfl/Dwfl.java +++ b/frysk-sys/lib/dwfl/Dwfl.java @@ -158,32 +158,32 @@ public class Dwfl { */ public void reportBegin() { fine.log(this, "reportBegin"); - reportBegin(pointer); + dwfl_report_begin(pointer); // fill modulesArray with the current modules and then clear // the set. Will iterate over the old modules so that they // are re-used. getModules(); modules.clear(); } - private static native void reportBegin(long pointer); + private static native void dwfl_report_begin(long pointer); /** * Finish a refresh of the address map. */ public void reportEnd() { fine.log(this, "reportEnd"); - reportEnd(pointer); + dwfl_report_end(pointer); // Finished; scrub references to old modules. modulesArray = null; } - private static native void reportEnd(long pointer); + private static native void dwfl_report_end(long pointer); /** * Report a mapped component. */ public void reportModule(String moduleName, long low, long high) { fine.log(this, "reportModule", moduleName, "low", low, "high", high); - long modulePointer = reportModule(pointer, moduleName, low, high); + long modulePointer = dwfl_report_module(pointer, moduleName, low, high); for (int i = 0; i < modulesArray.length; i++) { DwflModule module = modulesArray[i]; if (module.getName().equals(moduleName) @@ -202,8 +202,9 @@ public class Dwfl { finest.log(this, "reportModule creating", module); modules.put(new Long(modulePointer), module); } - private static native long reportModule(long pointer, String moduleName, - long low, long high); + private static native long dwfl_report_module(long pointer, + String moduleName, + long low, long high); private String name; private long low; @@ -211,14 +212,12 @@ public class Dwfl { private int devMajor; private int devMinor; private int inode; - private long vdso; /** * Start refreshing the address map using raw information * extracted from /proc/pid/maps. */ - public void mapBegin(long vdso) { + public void mapBegin() { reportBegin(); - this.vdso = vdso; name = null; } /** @@ -226,28 +225,38 @@ public class Dwfl { */ public void mapModule(String name, long low, long high, int devMajor, int devMinor, int inode) { - if (this.name != null && this.name.equals(name) + finest.log(this, "mapModule", name, "low", low, "high", high, + "devMajor", devMajor, "devMinor", devMinor, "inode", inode); + if (this.name != null + && this.name.equals(name) && this.devMajor == devMajor && this.devMinor == devMinor && this.inode == inode ) { + finest.log(this, "extending to", high); // A repeat of a previous map (but with more addresses) // extend the address range. this.high = high; } else { if (this.name != null) { // There's a previous map, report and flush it. + finest.log(this, "reporting", this.name); reportModule(this.name, this.low, this.high); this.name = null; } - if (name.equals("") - || (devMajor == 0 && devMinor == 0 && inode == 0)) { - // An empty map, do nothing. - } else if (this.vdso == low) { - // A vdso, report it immediatly. - reportModule(name, low, high); + if (name == null) { + finest.log(this, "ignoring null name"); + } else if (name.equals("")) { + 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. + finest.log(this, "ignoring non-file", name); } else { - // A new map, save it. + // A new map, save it, will be reported later. this.name = name; this.low = low; this.high = high; diff --git a/frysk-sys/lib/dwfl/DwflTestbed.java b/frysk-sys/lib/dwfl/DwflTestbed.java index 80aed86..fdbad8d 100644 --- a/frysk-sys/lib/dwfl/DwflTestbed.java +++ b/frysk-sys/lib/dwfl/DwflTestbed.java @@ -41,24 +41,9 @@ package lib.dwfl; import frysk.sys.proc.MapsBuilder; import frysk.sys.Pid; -import frysk.sys.proc.AuxvBuilder; public class DwflTestbed { - private static class VdsoBuilder extends AuxvBuilder { - long address; - public void buildBuffer(byte[] auxv) { - } - public void buildDimensions(int wordSize, boolean bigEndian, - int numberElements) { - } - public void buildAuxiliary(int index, int type, long value) { - if (type == inua.elf.AT.SYSINFO_EHDR) { - address = value; - } - } - } - private static class ModuleBuilder extends MapsBuilder { private final Dwfl dwfl; ModuleBuilder(Dwfl dwfl) { @@ -92,9 +77,7 @@ public class DwflTestbed { static Dwfl createFromSelf() { Dwfl dwfl = new Dwfl(""); ModuleBuilder maps = new ModuleBuilder(dwfl); - VdsoBuilder vdso = new VdsoBuilder(); - vdso.construct(Pid.get()); - dwfl.mapBegin(vdso.address); + dwfl.mapBegin(); maps.construct(Pid.get()); dwfl.mapEnd(); return dwfl; diff --git a/frysk-sys/lib/dwfl/TestDwfl.java b/frysk-sys/lib/dwfl/TestDwfl.java index d8076d2..2aee367 100644 --- a/frysk-sys/lib/dwfl/TestDwfl.java +++ b/frysk-sys/lib/dwfl/TestDwfl.java @@ -232,4 +232,21 @@ public class TestDwfl extends TestCase { } assertTrue(foundAddress); } + + public void testMapContainsVdso() { + if (unresolved(6626)) + return; + Dwfl dwfl = DwflTestbed.createFromSelf(); + DwflModule[] modules = dwfl.getModules(); + DwflModule vdso = null; + for (int i = 0; i < modules.length; i++) { + DwflModule module = modules[i]; + finest.log("module", i, "name", module); + if (module.getName().equals("[vdso]")) { + vdso = module; + break; + } + } + assertNotNull("vdso", vdso); + } } diff --git a/frysk-sys/lib/dwfl/cni/Dwfl.cxx b/frysk-sys/lib/dwfl/cni/Dwfl.cxx index ceb76aa..b0e8ba5 100644 --- a/frysk-sys/lib/dwfl/cni/Dwfl.cxx +++ b/frysk-sys/lib/dwfl/cni/Dwfl.cxx @@ -162,19 +162,19 @@ lib::dwfl::Dwfl::dwflEnd(jlong pointer){ } void -lib::dwfl::Dwfl::reportBegin(jlong pointer) { +lib::dwfl::Dwfl::dwfl_report_begin(jlong pointer) { ::dwfl_report_begin(DWFL_POINTER); } void -lib::dwfl::Dwfl::reportEnd(jlong pointer) { +lib::dwfl::Dwfl::dwfl_report_end(jlong pointer) { ::dwfl_report_end(DWFL_POINTER, NULL, NULL); } jlong -lib::dwfl::Dwfl::reportModule(jlong pointer, jstring moduleName, - jlong low, jlong high) { +lib::dwfl::Dwfl::dwfl_report_module(jlong pointer, jstring moduleName, + jlong low, jlong high) { jsize len = JvGetStringUTFLength(moduleName); char modName[len+1]; diff --git a/frysk-sys/lib/dwfl/jni/Dwfl.cxx b/frysk-sys/lib/dwfl/jni/Dwfl.cxx index c984daa..60a3ed3 100644 --- a/frysk-sys/lib/dwfl/jni/Dwfl.cxx +++ b/frysk-sys/lib/dwfl/jni/Dwfl.cxx @@ -167,19 +167,19 @@ lib::dwfl::Dwfl::dwflEnd(jnixx::env env, jlong pointer) { } void -lib::dwfl::Dwfl::reportBegin(jnixx::env env, jlong pointer) { +lib::dwfl::Dwfl::dwfl_report_begin(jnixx::env env, jlong pointer) { ::dwfl_report_begin(DWFL_POINTER); } void -lib::dwfl::Dwfl::reportEnd(jnixx::env env, jlong pointer) { +lib::dwfl::Dwfl::dwfl_report_end(jnixx::env env, jlong pointer) { ::dwfl_report_end(DWFL_POINTER, NULL, NULL); } jlong -lib::dwfl::Dwfl::reportModule(jnixx::env env, jlong pointer, - String jmoduleName, jlong low, jlong high) { +lib::dwfl::Dwfl::dwfl_report_module(jnixx::env env, jlong pointer, + String jmoduleName, jlong low, jlong high) { jstringUTFChars moduleName = jstringUTFChars(env, jmoduleName); return (jlong) ::dwfl_report_module(DWFL_POINTER, moduleName.elements(), (::Dwarf_Addr) low, hooks/post-receive -- frysk system monitor/debugger