public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Add test for [vdso], fail for moment. Date: Thu, 19 Jun 2008 17:42:00 -0000 [thread overview] Message-ID: <20080619174220.32546.qmail@sourceware.org> (raw) 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 <cagney@redhat.com> 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 <cagney@redhat.com> * Log.java: Add more methods. frysk-sys/frysk/testbed/ChangeLog 2008-06-19 Andrew Cagney <cagney@redhat.com> * 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 <cagney@redhat.com> * 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 <cagney@redhat.com> + + * Log.java: Add more methods. + 2008-06-04 Andrew Cagney <cagney@redhat.com> * 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: <tt>log("caller", log.CALLER)</tt> 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 <cagney@redhat.com> + + * 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 <cagney@redhat.com> * 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 <cagney@redhat.com> + + * 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 <cagney@redhat.com> * 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
reply other threads:[~2008-06-19 17:42 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20080619174220.32546.qmail@sourceware.org \ --to=cagney@sourceware.org \ --cc=frysk-cvs@sourceware.org \ --cc=frysk@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).