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: link
Be 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).