mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 14:42:11 +02:00
[111711] - added go to address action to cdi dissasembly view
This commit is contained in:
parent
666c642f44
commit
f38d981cc8
4 changed files with 155 additions and 0 deletions
|
@ -10,6 +10,7 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.debug.core.model;
|
package org.eclipse.cdt.debug.core.model;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.IAddress;
|
||||||
import org.eclipse.cdt.core.IAddressFactory;
|
import org.eclipse.cdt.core.IAddressFactory;
|
||||||
import org.eclipse.debug.core.DebugException;
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
|
||||||
|
@ -27,6 +28,16 @@ public interface IDisassembly extends ICDebugElement {
|
||||||
*/
|
*/
|
||||||
IDisassemblyBlock getDisassemblyBlock( ICStackFrame frame ) throws DebugException;
|
IDisassemblyBlock getDisassemblyBlock( ICStackFrame frame ) throws DebugException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the disassembly block for given stack frame.
|
||||||
|
*
|
||||||
|
* @param address the address from which the disassembly starts
|
||||||
|
* @return the disassembly block for given memory address
|
||||||
|
* @throws DebugException if this method fails.
|
||||||
|
* @since 6.0
|
||||||
|
*/
|
||||||
|
IDisassemblyBlock getDisassemblyBlock( IAddress address ) throws DebugException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the address factory associated with this element.
|
* Returns the address factory associated with this element.
|
||||||
*
|
*
|
||||||
|
|
|
@ -29,6 +29,9 @@ DebugActionSet.label=C/C++ Debug
|
||||||
RestartAction.label=Restart
|
RestartAction.label=Restart
|
||||||
RestartAction.tooltip=Restart
|
RestartAction.tooltip=Restart
|
||||||
|
|
||||||
|
DisassemblyViewAction.label=Go to address...
|
||||||
|
DisassemblyViewAction.tooltip=Enter memory address for the assembly code
|
||||||
|
|
||||||
ToggleInstructionStepModeAction.label=Instruction Stepping Mode
|
ToggleInstructionStepModeAction.label=Instruction Stepping Mode
|
||||||
ToggleInstructionStepModeAction.tooltip=Instruction Stepping Mode
|
ToggleInstructionStepModeAction.tooltip=Instruction Stepping Mode
|
||||||
|
|
||||||
|
|
|
@ -1088,6 +1088,23 @@
|
||||||
tooltip="%AddEventBreakpoint.tooltip">
|
tooltip="%AddEventBreakpoint.tooltip">
|
||||||
</action>
|
</action>
|
||||||
</viewContribution>
|
</viewContribution>
|
||||||
|
<viewContribution
|
||||||
|
id="org.eclipse.cdt.debug.ui.disassemblyView.menu"
|
||||||
|
targetID="org.eclipse.cdt.debug.ui.DisassemblyView">
|
||||||
|
<menu
|
||||||
|
id="org.eclipse.cdt.debug.ui.disassemblyViewMenu"
|
||||||
|
label="disassemblyViewMenu">
|
||||||
|
</menu>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.cdt.debug.internal.ui.views.disassembly.GoToAddressActionDelegate"
|
||||||
|
icon="icons/elcl16/show_ascii.gif"
|
||||||
|
id="org.eclipse.cdt.debug.internal.ui.actions.disassemblyViewAction"
|
||||||
|
label="%DisassemblyViewAction.label"
|
||||||
|
menubarPath="org.eclipse.cdt.debug.ui.disassemblyViewMenu"
|
||||||
|
style="push"
|
||||||
|
tooltip="%DisassemblyViewAction.tooltip">
|
||||||
|
</action>
|
||||||
|
</viewContribution>
|
||||||
<viewContribution
|
<viewContribution
|
||||||
targetID="org.eclipse.debug.ui.VariableView"
|
targetID="org.eclipse.debug.ui.VariableView"
|
||||||
id="org.eclipse.debug.ui.variablesView.toolbar">
|
id="org.eclipse.debug.ui.variablesView.toolbar">
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.views.disassembly;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.IAddress;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassembly;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblyBlock;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.model.Disassembly;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyEditorInput;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyView;
|
||||||
|
import org.eclipse.cdt.utils.Addr32;
|
||||||
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
import org.eclipse.debug.core.model.IDebugTarget;
|
||||||
|
import org.eclipse.debug.ui.IDebugUIConstants;
|
||||||
|
import org.eclipse.jface.action.IAction;
|
||||||
|
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||||
|
import org.eclipse.jface.dialogs.IInputValidator;
|
||||||
|
import org.eclipse.jface.dialogs.InputDialog;
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.jface.window.Window;
|
||||||
|
import org.eclipse.ui.IActionDelegate;
|
||||||
|
import org.eclipse.ui.IViewActionDelegate;
|
||||||
|
import org.eclipse.ui.IViewPart;
|
||||||
|
|
||||||
|
public class GoToAddressActionDelegate implements IActionDelegate, IViewActionDelegate {
|
||||||
|
private IViewPart fView;
|
||||||
|
private IAction fAction;
|
||||||
|
private DisassemblyView fDisassemblyView;
|
||||||
|
|
||||||
|
public void init(IViewPart view) {
|
||||||
|
setView(view);
|
||||||
|
if (view instanceof DisassemblyView) {
|
||||||
|
fDisassemblyView = (DisassemblyView) view;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setView(IViewPart view) {
|
||||||
|
fView = view;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IViewPart getView() {
|
||||||
|
return fView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(IAction action) {
|
||||||
|
String address;
|
||||||
|
InputDialog dialog = new InputDialog(fView.getViewSite().getShell(), "Enter address", "Enter address to go to", "",
|
||||||
|
new IInputValidator() {
|
||||||
|
public String isValid(String in) {
|
||||||
|
try {
|
||||||
|
String input = in.trim();
|
||||||
|
if (input.length() == 0)
|
||||||
|
return "Cannot be empty address";
|
||||||
|
if (input.toLowerCase().startsWith("0x")) {
|
||||||
|
Long.parseLong(input.substring(2), 16);
|
||||||
|
} else {
|
||||||
|
Long.parseLong(input);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} catch (NumberFormatException ex) {
|
||||||
|
return "Must be a hexadecimal or decimal address";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
address = dialog.getValue();
|
||||||
|
gotoAddress(address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setAction(IAction action) {
|
||||||
|
fAction = action;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IAction getAction() {
|
||||||
|
return fAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectionChanged(IAction action, ISelection selection) {
|
||||||
|
setAction(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void gotoAddress(String addr) {
|
||||||
|
IAddress address = new Addr32(addr);
|
||||||
|
if (fDisassemblyView != null) {
|
||||||
|
ICDebugTarget target = null;
|
||||||
|
ISelection selection = fDisassemblyView.getSite().getPage().getSelection(IDebugUIConstants.ID_DEBUG_VIEW);
|
||||||
|
if (selection instanceof IStructuredSelection) {
|
||||||
|
Object element = ((IStructuredSelection) selection).getFirstElement();
|
||||||
|
if (element instanceof ICStackFrame) {
|
||||||
|
IDebugTarget tar = ((ICStackFrame) element).getDebugTarget();
|
||||||
|
if (tar instanceof ICDebugTarget) {
|
||||||
|
target = (ICDebugTarget) tar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DisassemblyEditorInput input = null;
|
||||||
|
try {
|
||||||
|
input = create(target, address);
|
||||||
|
fDisassemblyView.setViewerInput(input);
|
||||||
|
} catch (DebugException e) {
|
||||||
|
MessageDialog dialog = new MessageDialog(fView.getViewSite().getShell(), "Wrong address", null,
|
||||||
|
"Cannot access memory at address " + addr, MessageDialog.ERROR, new String[] { IDialogConstants.OK_LABEL },
|
||||||
|
0);
|
||||||
|
dialog.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DisassemblyEditorInput create(ICDebugTarget target, IAddress address) throws DebugException {
|
||||||
|
DisassemblyEditorInput input = null;
|
||||||
|
IDisassembly disassembly = target.getDisassembly();
|
||||||
|
if (disassembly instanceof Disassembly) {
|
||||||
|
IDisassemblyBlock block = ((Disassembly) disassembly).getDisassemblyBlock(address);
|
||||||
|
input = DisassemblyEditorInput.create(block);
|
||||||
|
}
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue