From: PEARLY.ZHAO@ORACLE.COM
To: Frysk Mailing List <frysk@sourceware.org>, pearly.zhao@ORACLE.COM
Subject: Re: [patch] Accept symbolic addresses in spin button, bug 4673.
Date: Wed, 12 Sep 2007 13:33:00 -0000 [thread overview]
Message-ID: <17474866.1189604007745.JavaMail.oracle@acsmt303.oracle.com> (raw)
In-Reply-To: <1189584690.4843.23.camel@linux-pzhao.site>
Actually, retrieving symbol addresses in the classes implementing the disssembly and memory windows is a wrong way to implement this functionality. Maybe it should be designed at core. The classes handling the windows merely use it to obtain the information.
Pearly
> Hi,
>
> This patch can make the disassembly/memory window accept symbol
> name in
> spin Button.
>
> Here is what it does:
> - When input a available symbol name at fromBox, the window
> would
> display the disassembly/memory of this symbol. The fromBox/fromSpin
> would be set the start address of this symbol and the toBox/toSpin
> would
> be set the end address of this symbol.
> - When input a available symbol name at toBox, it would do as
> same as
> when input at fromBox.
> - When input a unavailable symbol name, the fromBox/fromSpin
> or
> toBox/toSpin would be reset to the lastKnownFrom or lastKnownTo.
>
> Any suggestions are welcomed.
>
> Pearly Zhao
>
> --------Index: disassembler/DisassemblyWindow.java
> ===================================================================
> RCS file: /cvs/frysk/frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java,v
> retrieving revision 1.31
> diff -u -r1.31 DisassemblyWindow.java
> --- disassembler/DisassemblyWindow.java 7 Sep 2007 03:18:50
> -0000 1.31
> +++ disassembler/DisassemblyWindow.java 12 Sep 2007 07:43:28
> -0000
> @@ -42,6 +42,7 @@
> package frysk.gui.disassembler;
>
> import java.util.prefs.Preferences;
> +import java.util.LinkedList;
> import java.util.List;
> import java.util.Iterator;
> import java.util.ListIterator;
> @@ -74,6 +75,7 @@
> import org.gnu.gtk.event.SpinEvent;
> import org.gnu.gtk.event.SpinListener;
>
> +import frysk.dwfl.DwflCache;
> import frysk.gui.common.IconManager;
> import frysk.gui.prefs.PreferenceManager;
> import frysk.gui.monitor.Saveable;
> @@ -81,7 +83,12 @@
> import frysk.proc.Task;
> import frysk.stepping.TaskStepEngine;
> import frysk.proc.MemoryMap;
> +import frysk.symtab.Symbol;
> +import frysk.symtab.SymbolFactory;
>
> +import lib.dwfl.Dwfl;
> +import lib.dwfl.DwflModule;
> +import lib.dwfl.SymbolBuilder;
> import lib.opcodes.Disassembler;
> import lib.opcodes.Instruction;
>
> @@ -379,28 +386,42 @@
> return;
>
> String str = fromBox.getText();
> - str = str.substring(2);
> - try
> +
> + if (str.startsWith("0x"))
> {
> - double d = (double) Long.parseLong(str, 16);
> - if (!addressAccessible((long)d))
> - fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> - else
> - {
> - if (d > lastKnownTo)
> + str = str.substring(2);
> + try
> + {
> + double d = (double) Long.parseLong(str,
> 16);
> + if (!addressAccessible((long)d))
> + fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> + else
> {
> - if (lastKnownTo == lastKnownFrom)
> - handleFromSpin(lastKnownTo);
> + if (d > lastKnownTo)
> + {
> + if (lastKnownTo == lastKnownFrom)
> + handleFromSpin(lastKnownTo);
> + else
> + fromSpin.setValue(lastKnownTo);
> + }
> else
> - fromSpin.setValue(lastKnownTo);
> + fromSpin.setValue(d);
> }
> - else
> - fromSpin.setValue(d);
> - }
> + }
> + catch (NumberFormatException nfe)
> + {
> + fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> + }
> }
> - catch (NumberFormatException nfe)
> - {
> - fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> + else
> + {
> + try
> + {
> + handleSymbol(str);
> + }
> + catch (RuntimeException e){
> + fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> + }
> }
> }
> }
> @@ -416,28 +437,41 @@
> return;
>
> String str = toBox.getText();
> - str = str.substring(2);
> - try
> + if (str.startsWith("0x"))
> {
> - double d = (double) Long.parseLong(str, 16);
> - if (!(addressAccessible((long)d)))
> - toBox.setText("0x" + Long.toHexString((long)
> lastKnownTo));
> - else
> - {
> - if (d < lastKnownFrom)
> + str = str.substring(2);
> + try
> + {
> + double d = (double) Long.parseLong(str,
> 16);
> + if (!(addressAccessible((long)d)))
> + toBox.setText("0x" + Long.toHexString((long)
> lastKnownTo));
> + else
> {
> - if (lastKnownFrom == lastKnownTo)
> - handleToSpin(lastKnownFrom);
> + if (d < lastKnownFrom)
> + {
> + if (lastKnownFrom == lastKnownTo)
> + handleToSpin(lastKnownFrom);
> + else
> + toSpin.setValue(lastKnownFrom);
> + }
> else
> - toSpin.setValue(lastKnownFrom);
> + toSpin.setValue(d);
> }
> - else
> - toSpin.setValue(d);
> - }
> + }
> + catch (NumberFormatException nfe)
> + {
> + toBox.setText("0x" + Long.toHexString((long)
> lastKnownTo));
> + }
> }
> - catch (NumberFormatException nfe)
> - {
> - toBox.setText("0x" + Long.toHexString((long)
> lastKnownTo));
> + else
> + {
> + try
> + {
> + handleSymbol(str);
> + }
> + catch (RuntimeException e){
> + toBox.setText("0x" + Long.toHexString((long)
> lastKnownTo));
> + }
> }
> }
> }
> @@ -539,6 +573,32 @@
> }
> this.refreshList();
> }
> +
> + /**
> + * Get the address list from symbol name;
> + * @param name
> + * @return address list
> + */
> + private LinkedList addressesForSymbol(String name) {
> + Dwfl dwfl = DwflCache.getDwfl(this.myTask);
> + DwflModule[] modules = dwfl.getModules();
> + final LinkedList addrs = new LinkedList();
> + SymbolBuilder builder = new SymbolBuilder() {
> + public void symbol(String name, long value, long size,
> + int type, int bind, int visibility) {
> + addrs.add(new Long(value));
> + }
> + };
> + for (int i = 0; i < modules.length; i++)
> + {
> + DwflModule module = modules[i];
> + module.getSymbolByName(name, builder);
> + }
> + if (addrs.size() == 0)
> + throw new RuntimeException("Couldn't find symbol " +
> name);
> + else
> + return addrs;
> + }
> /**
> * return a boolean indicating whether or not this address
> is accessible.
> *
> @@ -640,16 +700,17 @@
> * By default append rows to the end.
> *
> * @param i The address to be displayed
> + * @param numIns The Instructions that maybe be added
> * @param iter The TreeIter representing the row to be
> added.
> */
> - public synchronized void rowAppend (long i, TreeIter iter)
> + public synchronized void rowAppend (long i, int numIns,
> TreeIter iter)
> {
> // if (iter == null)
> // iter = model.appendRow();
>
> List instructionsList
> = diss.disassembleInstructions((long) this.lastKnownTo,
> - numInstructions);
> + numInstructions+numIns);
> Iterator li = instructionsList.listIterator(0);
> Instruction ins = (Instruction) li.next();
>
> @@ -661,8 +722,10 @@
> this.lastPath.next();
> if (ins != null)
> {
> - if (li.hasNext())
> + if (li.hasNext()){
> ins = (Instruction) li.next();
> + this.numInstructions++;
> + }
> else
> {
> this.toSpin.setValue((double) ins.address);
> @@ -858,10 +921,11 @@
>
> if (val > this.lastKnownTo)
> {
> - for (long i = (long) lastKnownTo + 1; i < val + 1;
> i++)
> - ++this.numInstructions;
> + int numIns = 0;
> + for (long i = (long) lastKnownTo + 1; i < val + 1; i++)
> + ++numIns;
>
> - rowAppend((long) val, null);
> + rowAppend((long) val, numIns, null);
>
> return;
> }
> @@ -895,6 +959,48 @@
> refreshList();
> }
> }
> +
> + /**
> + * When the box is inputed a symbol, update the displayed
> information to the symbol.
> + * @param symbolName
> + */
> + private synchronized void handleSymbol(String symbolName)
> + {
> + LinkedList addressList = addressesForSymbol(symbolName);
> + long startAddress = ((Long)addressList.getFirst()).longValue();
> + Symbol symbol = SymbolFactory.getSymbol(this.myTask,
> startAddress);
> + long endAddress = symbol.getAddress() + symbol.getSize();
> +
> + List instructionsList
> + = diss.disassembleInstructionsStartEnd((long)startAddress,
> (long)endAddress);
> + Iterator li = instructionsList.listIterator(0);
> + int insnum = 1;
> + Instruction ins = (Instruction)li.next();
> + this.lastKnownFrom = (double)ins.address;
> + while (li.hasNext()){
> + ins = (Instruction)li.next();
> + insnum++;
> + }
> + this.lastKnownTo = (double)ins.address;
> +
> + TreeIter iter = this.model.getFirstIter();
> + while (insnum < numInstructions)
> + {
> + this.model.removeRow(iter);
> + this.lastPath.previous();
> + numInstructions--;
> + }
> + while(insnum > numInstructions)
> + {
> + this.model.appendRow();
> + this.lastPath.next();
> + numInstructions++;
> + }
> +
> + refreshList();
> + fromBox.setText("0x" + Long.toHexString((long)lastKnownFrom));
> + fromSpin.setValue(lastKnownFrom);
> + }
>
> /****************************************************************************
> * Save and Load
> Index: memory/MemoryWindow.java
> ===================================================================
> RCS file: /cvs/frysk/frysk-gui/frysk/gui/memory/MemoryWindow.java,v
> retrieving revision 1.46
> diff -u -r1.46 MemoryWindow.java
> --- memory/MemoryWindow.java 7 Sep 2007 03:18:50 -0000 1.46
> +++ memory/MemoryWindow.java 12 Sep 2007 07:43:29 -0000
> @@ -42,6 +42,7 @@
> package frysk.gui.memory;
>
> import java.util.prefs.Preferences;
> +import java.util.LinkedList;
> import java.util.List;
> import java.util.Iterator;
> import java.util.Observable;
> @@ -78,6 +79,7 @@
> import org.gnu.gtk.event.SpinEvent;
> import org.gnu.gtk.event.SpinListener;
>
> +import frysk.dwfl.DwflCache;
> import frysk.gui.common.IconManager;
> import frysk.gui.prefs.PreferenceManager;
> import frysk.gui.monitor.GuiObject;
> @@ -87,8 +89,13 @@
> import frysk.proc.Proc;
> import frysk.proc.Task;
> import frysk.stepping.TaskStepEngine;
> +import frysk.symtab.Symbol;
> +import frysk.symtab.SymbolFactory;
> import frysk.proc.MemoryMap;
>
> +import lib.dwfl.Dwfl;
> +import lib.dwfl.DwflModule;
> +import lib.dwfl.SymbolBuilder;
> import lib.opcodes.Disassembler;
> import lib.opcodes.Instruction;
>
> @@ -511,28 +518,41 @@
> return;
>
> String str = fromBox.getText();
> - str = str.substring(2);
> - try
> + if (str.startsWith("0x"))
> {
> - double d = (double) Long.parseLong(str, 16);
> - if (!addressAccessible((long)d))
> - fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> - else
> - {
> - if (d > lastKnownTo)
> + str = str.substring(2);
> + try
> + {
> + double d = (double) Long.parseLong(str,
> 16);
> + if (!addressAccessible((long)d))
> + fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> + else
> {
> - if (lastKnownTo == lastKnownFrom)
> - handleFromSpin(lastKnownTo);
> + if (d > lastKnownTo)
> + {
> + if (lastKnownTo == lastKnownFrom)
> + handleFromSpin(lastKnownTo);
> + else
> + fromSpin.setValue(lastKnownTo);
> + }
> else
> - fromSpin.setValue(lastKnownTo);
>
> + fromSpin.setValue(d);
> }
> - else
> - fromSpin.setValue(d);
> - }
> + }
> + catch (NumberFormatException nfe)
> + {
> + fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> + }
> }
> - catch (NumberFormatException nfe)
> - {
> - fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> + else
> + {
> + try
> + {
> + handleSymbol(str);
> + }
> + catch (RuntimeException e){
> + fromBox.setText("0x" + Long.toHexString((long)
> lastKnownFrom));
> + }
> }
> }
> }
> @@ -548,23 +568,41 @@
> return;
>
> String str = toBox.getText();
> - str = str.substring(2);
> - try
> + if (str.startsWith("0x"))
> {
> - double d = (double) Long.parseLong(str, 16);
> - if (d < lastKnownFrom)
> - {
> - if (lastKnownFrom == lastKnownTo)
> - handleToSpin(lastKnownFrom);
> - else
> - toSpin.setValue(lastKnownFrom);
> - }
> - else
> - toSpin.setValue(d);
> + str = str.substring(2);
> + try
> + {
> + double d = (double) Long.parseLong(str,
> 16);
> + if (!(addressAccessible((long)d)))
> + toBox.setText("0x" + Long.toHexString((long)
> lastKnownTo));
> + else
> + {
> + if (d < lastKnownFrom)
> + {
> + if (lastKnownFrom == lastKnownTo)
> + handleToSpin(lastKnownFrom);
> + else
> + toSpin.setValue(lastKnownFrom);
> + }
> + else
> + toSpin.setValue(d);
> + }
> + }
> + catch (NumberFormatException nfe)
> + {
> + toBox.setText("0x" + Long.toHexString((long)
> lastKnownTo));
> + }
> }
> - catch (NumberFormatException nfe)
> - {
> - toBox.setText("0x" + Long.toHexString((long)
> lastKnownTo));
> + else
> + {
> + try
> + {
> + handleSymbol(str);
> + }
> + catch (RuntimeException e){
> + toBox.setText("0x" + Long.toHexString((long)
> lastKnownTo));
> + }
> }
> }
> }
> @@ -573,6 +611,32 @@
> }
>
> /**
> + * Get the address list from symbol name;
> + * @param name
> + * @return address list
> + */
> + private LinkedList addressesForSymbol(String name) {
> + Dwfl dwfl = DwflCache.getDwfl(this.myTask);
> + DwflModule[] modules = dwfl.getModules();
> + final LinkedList addrs = new LinkedList();
> + SymbolBuilder builder = new SymbolBuilder() {
> + public void symbol(String name, long value, long size,
> + int type, int bind, int visibility) {
> + addrs.add(new Long(value));
> + }
> + };
> + for (int i = 0; i < modules.length; i++)
> + {
> + DwflModule module = modules[i];
> + module.getSymbolByName(name, builder);
> + }
> + if (addrs.size() == 0)
> + throw new RuntimeException("Couldn't find symbol " +
> name);
> + else
> + return addrs;
> + }
> +
> + /**
> * return a boolean indicating whether or not this address
> is accessible.
> *
> * @return whether or not this address is accessible
> @@ -612,6 +676,7 @@
> this.refreshLock = false;
> }
>
> +
> /*****************************************************************************
> * Calculation, memory reading, and information display
> methods
> ****************************************************************************/
> @@ -1011,6 +1076,47 @@
> this.lastKnownTo = val;
> refreshList();
> }
> +
> + /**
> + * When the box is inputed a symbol, update the displayed
> information to the symbol.
> + * @param symbolName
> + */
> + private synchronized void handleSymbol(String symbolName)
> + {
> + LinkedList addressList = addressesForSymbol(symbolName);
> + long startAddress = ((Long)addressList.getFirst()).longValue();
> + Symbol symbol = SymbolFactory.getSymbol(this.myTask,
> startAddress);
> + long endAddress = symbol.getAddress() + symbol.getSize();
> + long size = endAddress - startAddress + 1;
> + long modelSize = (long)lastKnownTo - (long)lastKnownFrom
> + 1;
> + TreeIter iter = this.model.getFirstIter();
> + while (size < modelSize)
> + {
> + this.model.removeRow(iter);
> + this.lastPath.previous();
> + modelSize--;
> + }
> + while(size > modelSize)
> + {
> + this.model.appendRow();
> + this.lastPath.next();
> + modelSize++;
> + }
> + this.lastKnownFrom = (double)startAddress;
> + this.lastKnownTo = (double)endAddress;
> + iter = this.model.getFirstIter();
> + this.lastPath = iter.getPath();
> + for(long i= startAddress; i < endAddress+1; i++)
> + {
> + rowAppend(i, iter);
> + iter = iter.getNextIter();
> + }
> + refreshList();
> + fromBox.setText("0x" + Long.toHexString((long)lastKnownFrom));
> + fromSpin.setValue(lastKnownFrom);
> + toBox.setText("0x" + Long.toHexString((long)lastKnownTo));
> + toSpin.setValue(lastKnownTo);
> + }
>
> /****************************************************************************
> * Save and Load
>
next prev parent reply other threads:[~2007-09-12 13:33 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-12 8:05 Zhao Shujing
2007-09-12 13:33 ` PEARLY.ZHAO [this message]
2007-09-19 1:19 ` Zhao Shujing
2007-09-21 21:53 ` Andrew Cagney
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=17474866.1189604007745.JavaMail.oracle@acsmt303.oracle.com \
--to=pearly.zhao@oracle.com \
--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).