mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 06:32:10 +02:00
Bug 573157: Add jump to memory from disassembly view context menu entry
Change-Id: I045f3ac24005212d7431d346f0a3a169abbd8de0
This commit is contained in:
parent
f877963e37
commit
335437d667
7 changed files with 283 additions and 0 deletions
|
@ -53,6 +53,8 @@ action.refreshAll.name=Refresh Debug Views
|
||||||
|
|
||||||
action.refresh.label=Refresh
|
action.refresh.label=Refresh
|
||||||
|
|
||||||
|
action.jumpToMemory.label=Jump to Memory
|
||||||
|
|
||||||
popup.addExpression.label=Add Watch Expression...
|
popup.addExpression.label=Add Watch Expression...
|
||||||
popup.resumeAtLine.label=Resume At Li&ne
|
popup.resumeAtLine.label=Resume At Li&ne
|
||||||
popup.moveToLine.label=&Move To Line\u0020
|
popup.moveToLine.label=&Move To Line\u0020
|
||||||
|
@ -67,6 +69,10 @@ command.addRegisters.name=Add Expression Group > Registers
|
||||||
command.refreshAll.name=Refresh Debug Views
|
command.refreshAll.name=Refresh Debug Views
|
||||||
command.refreshAll.description=Refresh all data in debug views
|
command.refreshAll.description=Refresh all data in debug views
|
||||||
|
|
||||||
|
# jump to memory
|
||||||
|
command.jumpToMemory.name=Jump to Memory
|
||||||
|
command.jumpToMemory.description=Open memory view and add memory monitor for address
|
||||||
|
|
||||||
# Preferences
|
# Preferences
|
||||||
|
|
||||||
StaleData.foreground.label=Stale data foreground color\u0020
|
StaleData.foreground.label=Stale data foreground color\u0020
|
||||||
|
|
|
@ -629,6 +629,12 @@
|
||||||
categoryId="org.eclipse.debug.ui.category.run"
|
categoryId="org.eclipse.debug.ui.category.run"
|
||||||
>
|
>
|
||||||
</command>
|
</command>
|
||||||
|
<command
|
||||||
|
categoryId="org.eclipse.debug.ui.category.run"
|
||||||
|
defaultHandler="org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.RulerJumpToMemoryHandler"
|
||||||
|
description="%command.jumpToMemory.description"
|
||||||
|
id="org.eclipse.cdt.debug.ui.memory.memorybrowser.jumpToMemory"
|
||||||
|
name="%command.jumpToMemory.name"/>
|
||||||
</extension>
|
</extension>
|
||||||
|
|
||||||
<extension point="org.eclipse.ui.bindings">
|
<extension point="org.eclipse.ui.bindings">
|
||||||
|
@ -707,6 +713,12 @@
|
||||||
label="%action.toggleBreakpoint.label"
|
label="%action.toggleBreakpoint.label"
|
||||||
menubarPath="debug">
|
menubarPath="debug">
|
||||||
</action>
|
</action>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.RulerJumpToMemoryActionDelegate"
|
||||||
|
id="org.eclipse.debug.ui.actions.RulerJumpToMemoryAction"
|
||||||
|
label="%action.jumpToMemory.label"
|
||||||
|
menubarPath="debug">
|
||||||
|
</action>
|
||||||
</viewerContribution>
|
</viewerContribution>
|
||||||
</extension>
|
</extension>
|
||||||
|
|
||||||
|
|
|
@ -92,6 +92,10 @@ public final class DisassemblyMessages extends NLS {
|
||||||
public static String Disassembly_action_AddBreakpoint_errorTitle;
|
public static String Disassembly_action_AddBreakpoint_errorTitle;
|
||||||
public static String Disassembly_action_AddBreakpoint_errorMessage;
|
public static String Disassembly_action_AddBreakpoint_errorMessage;
|
||||||
public static String Disassembly_action_ToggleBreakpoint_accelerator;
|
public static String Disassembly_action_ToggleBreakpoint_accelerator;
|
||||||
|
public static String Disassembly_action_JumpToMemory_label;
|
||||||
|
public static String Disassembly_action_JumpToMemory_tooltip;
|
||||||
|
public static String Disassembly_action_JumpToMemory_errorTitle;
|
||||||
|
public static String Disassembly_action_JumpToMemory_errorMessage;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
NLS.initializeMessages(DisassemblyMessages.class.getName(), DisassemblyMessages.class);
|
NLS.initializeMessages(DisassemblyMessages.class.getName(), DisassemblyMessages.class);
|
||||||
|
|
|
@ -32,6 +32,10 @@ Disassembly_action_TrackExpression_label=Track Expression
|
||||||
Disassembly_action_AddBreakpoint_label=Add Breakpoint...
|
Disassembly_action_AddBreakpoint_label=Add Breakpoint...
|
||||||
Disassembly_action_AddBreakpoint_errorTitle=Error
|
Disassembly_action_AddBreakpoint_errorTitle=Error
|
||||||
Disassembly_action_AddBreakpoint_errorMessage=Unable to create breakpoint
|
Disassembly_action_AddBreakpoint_errorMessage=Unable to create breakpoint
|
||||||
|
Disassembly_action_JumpToMemory_label=Jump To Memory
|
||||||
|
Disassembly_action_JumpToMemory_tooltip=Open memory view and add memory monitor for address
|
||||||
|
Disassembly_action_JumpToMemory_errorTitle=Error on jump to memory
|
||||||
|
Disassembly_action_JumpToMemory_errorMessage=Unable to jump to memory location
|
||||||
|
|
||||||
Disassembly_GotoAddressDialog_title=Go to Address
|
Disassembly_GotoAddressDialog_title=Go to Address
|
||||||
Disassembly_GotoAddressDialog_label=Address expression:
|
Disassembly_GotoAddressDialog_label=Address expression:
|
||||||
|
|
|
@ -0,0 +1,182 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2021 Intel Corporation.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License 2.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* https://www.eclipse.org/legal/epl-2.0/
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: EPL-2.0
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Intel Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.IAddress;
|
||||||
|
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||||
|
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.DisassemblyMessages;
|
||||||
|
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.DisassemblySelection;
|
||||||
|
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.IDisassemblyPart;
|
||||||
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.model.IMemoryBlock;
|
||||||
|
import org.eclipse.debug.core.model.IMemoryBlockExtension;
|
||||||
|
import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension;
|
||||||
|
import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
|
||||||
|
import org.eclipse.debug.ui.DebugUITools;
|
||||||
|
import org.eclipse.debug.ui.IDebugUIConstants;
|
||||||
|
import org.eclipse.debug.ui.memory.IMemoryRendering;
|
||||||
|
import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
|
||||||
|
import org.eclipse.debug.ui.memory.IMemoryRenderingSite;
|
||||||
|
import org.eclipse.debug.ui.memory.IMemoryRenderingType;
|
||||||
|
import org.eclipse.jface.dialogs.ErrorDialog;
|
||||||
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
|
import org.eclipse.jface.text.IDocument;
|
||||||
|
import org.eclipse.jface.text.IRegion;
|
||||||
|
import org.eclipse.jface.text.ITextSelection;
|
||||||
|
import org.eclipse.jface.text.TextSelection;
|
||||||
|
import org.eclipse.jface.text.source.IVerticalRulerInfo;
|
||||||
|
import org.eclipse.jface.viewers.ISelectionProvider;
|
||||||
|
import org.eclipse.ui.IViewPart;
|
||||||
|
import org.eclipse.ui.IWorkbenchPage;
|
||||||
|
import org.eclipse.ui.IWorkbenchPartSite;
|
||||||
|
import org.eclipse.ui.PartInitException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ruler action to jump to a memory location using the address of the last row selection.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("restriction")
|
||||||
|
public final class RulerJumpToMemoryAction extends AbstractDisassemblyRulerAction {
|
||||||
|
private static final String MEMORY_VIEW_ID = "org.eclipse.debug.ui.MemoryView"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public RulerJumpToMemoryAction(IDisassemblyPart disassemblyPart, IVerticalRulerInfo rulerInfo) {
|
||||||
|
super(disassemblyPart, rulerInfo);
|
||||||
|
setText(DisassemblyMessages.Disassembly_action_JumpToMemory_label);
|
||||||
|
setToolTipText(DisassemblyMessages.Disassembly_action_JumpToMemory_tooltip);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (getRulerInfo() == null || getDisassemblyPart() == null) {
|
||||||
|
reportException(new Exception("The current selection is invalid.")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IAddress address = getAddress();
|
||||||
|
if (address == null) {
|
||||||
|
reportException(new Exception("Failed to retrieve memory address.")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IWorkbenchPartSite site = getDisassemblyPart().getSite();
|
||||||
|
if (site == null) {
|
||||||
|
reportException(new Exception("No workbench site available. Disassembly view not initialized?")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IWorkbenchPage page = site.getPage();
|
||||||
|
if (page == null) {
|
||||||
|
reportException(new Exception("No workbench page available. Disassembly view not initialized?")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IViewPart viewPart = page.findView(MEMORY_VIEW_ID);
|
||||||
|
if (viewPart != null) {
|
||||||
|
page.activate(viewPart);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
viewPart = page.showView(MEMORY_VIEW_ID);
|
||||||
|
} catch (PartInitException e) {
|
||||||
|
reportException(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(viewPart instanceof IMemoryRenderingSite)) {
|
||||||
|
reportException(new Exception("Failed to open memory view.")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
addMemoryBlock((IMemoryRenderingSite) viewPart, address.toHexAddressString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add memory block for the given address.
|
||||||
|
*
|
||||||
|
* @param memoryView the memory view
|
||||||
|
* @param address the memory address to add the block for
|
||||||
|
*/
|
||||||
|
private void addMemoryBlock(IMemoryRenderingSite memoryView, String address) {
|
||||||
|
try {
|
||||||
|
IAdaptable debugContext = DebugUITools.getPartDebugContext(getDisassemblyPart().getSite());
|
||||||
|
|
||||||
|
IMemoryBlockRetrievalExtension memRetrieval = (IMemoryBlockRetrievalExtension) MemoryViewUtil
|
||||||
|
.getMemoryBlockRetrieval(debugContext);
|
||||||
|
|
||||||
|
// get extended memory block with the expression entered
|
||||||
|
IMemoryBlockExtension memBlock = memRetrieval.getExtendedMemoryBlock(address, debugContext);
|
||||||
|
|
||||||
|
// add block to memory block manager
|
||||||
|
if (memBlock == null) {
|
||||||
|
throw new Exception("Failed to retrieve memory block."); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
IMemoryBlock[] memArray = new IMemoryBlock[] { memBlock };
|
||||||
|
|
||||||
|
DebugPlugin.getDefault().getMemoryBlockManager().addMemoryBlocks(memArray);
|
||||||
|
|
||||||
|
IMemoryRenderingType renderingType = DebugUITools.getMemoryRenderingManager()
|
||||||
|
.getPrimaryRenderingType(memBlock);
|
||||||
|
|
||||||
|
IMemoryRendering rendering = renderingType.createRendering();
|
||||||
|
|
||||||
|
IMemoryRenderingContainer container = memoryView.getContainer(IDebugUIConstants.ID_RENDERING_VIEW_PANE_1);
|
||||||
|
|
||||||
|
rendering.init(container, memBlock);
|
||||||
|
container.addMemoryRendering(rendering);
|
||||||
|
} catch (Exception e) {
|
||||||
|
reportException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the address from the current selection, or <code>null</code>
|
||||||
|
*/
|
||||||
|
private IAddress getAddress() {
|
||||||
|
int lastLine = getRulerInfo().getLineOfLastMouseButtonActivity();
|
||||||
|
if (lastLine < 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ISelectionProvider provider = getDisassemblyPart().getSite().getSelectionProvider();
|
||||||
|
if (provider == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
IDocument document = getDisassemblyPart().getTextViewer().getDocument();
|
||||||
|
if (document == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
IRegion region;
|
||||||
|
try {
|
||||||
|
region = document.getLineInformation(lastLine);
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ITextSelection textSelection = new TextSelection(document, region.getOffset(), 0);
|
||||||
|
DisassemblySelection selection = new DisassemblySelection(textSelection, getDisassemblyPart());
|
||||||
|
return selection.getStartAddress();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Report an error to the user.
|
||||||
|
*
|
||||||
|
* @param e underlying exception
|
||||||
|
*/
|
||||||
|
private void reportException(Exception e) {
|
||||||
|
IStatus status = new Status(IStatus.ERROR, CDebugUIPlugin.PLUGIN_ID, "Error on jump to memory: ", e); //$NON-NLS-1$
|
||||||
|
ErrorDialog.openError(getDisassemblyPart().getSite().getShell(),
|
||||||
|
DisassemblyMessages.Disassembly_action_JumpToMemory_errorTitle,
|
||||||
|
DisassemblyMessages.Disassembly_action_JumpToMemory_errorMessage, status);
|
||||||
|
CDebugUIPlugin.log(status);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2021 Intel Corporation.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License 2.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* https://www.eclipse.org/legal/epl-2.0/
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: EPL-2.0
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Intel Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.IDisassemblyPart;
|
||||||
|
import org.eclipse.jface.action.IAction;
|
||||||
|
import org.eclipse.jface.text.source.IVerticalRulerInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ruler jump to memory delegate for disassembly parts.
|
||||||
|
*/
|
||||||
|
public class RulerJumpToMemoryActionDelegate extends AbstractDisassemblyRulerActionDelegate {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.AbstractDisassemblyRulerActionDelegate#createAction(org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.IDisassemblyPart, org.eclipse.jface.text.source.IVerticalRulerInfo)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected IAction createAction(IDisassemblyPart disassemblyPart, IVerticalRulerInfo rulerInfo) {
|
||||||
|
return new RulerJumpToMemoryAction(disassemblyPart, rulerInfo);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2021 Intel Corporation.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License 2.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* https://www.eclipse.org/legal/epl-2.0/
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: EPL-2.0
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Intel Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.IDisassemblyPart;
|
||||||
|
import org.eclipse.core.commands.AbstractHandler;
|
||||||
|
import org.eclipse.core.commands.ExecutionEvent;
|
||||||
|
import org.eclipse.core.commands.ExecutionException;
|
||||||
|
import org.eclipse.jface.text.source.IVerticalRulerInfo;
|
||||||
|
import org.eclipse.ui.IWorkbenchPart;
|
||||||
|
import org.eclipse.ui.handlers.HandlerUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default handler for the jump to memory command in the disassembly ruler.
|
||||||
|
*
|
||||||
|
* @since 2.10
|
||||||
|
*/
|
||||||
|
public class RulerJumpToMemoryHandler extends AbstractHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object execute(ExecutionEvent event) throws ExecutionException {
|
||||||
|
IWorkbenchPart part = HandlerUtil.getActivePartChecked(event);
|
||||||
|
if (part instanceof IDisassemblyPart) {
|
||||||
|
IDisassemblyPart disassemblyPart = (IDisassemblyPart) part;
|
||||||
|
final IVerticalRulerInfo rulerInfo = part.getAdapter(IVerticalRulerInfo.class);
|
||||||
|
if (rulerInfo != null) {
|
||||||
|
new RulerJumpToMemoryAction(disassemblyPart, rulerInfo).run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue