From 3964dbeab6c33f5a79e46257dc14df43695ceed3 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Fri, 20 Apr 2012 16:11:04 -0400 Subject: [PATCH] Bug 373707: [tracepoints] Make use of the new 'collect /s' command Change-Id: I60689b73dd1f081fa3e3b53807e52800c9c03006 Reviewed-on: https://git.eclipse.org/r/5576 Reviewed-by: Marc Khouzam IP-Clean: Marc Khouzam Tested-by: Marc Khouzam --- .../tracepointactions/CollectActionPage.java | 125 +++++++++++++++++- .../MessagesForTracepointActions.java | 6 +- .../ui/tracepointactions/messages.properties | 6 +- .../cdt/dsf/gdb/internal/GdbPlugin.java | 41 ++++++ .../tracepointactions/CollectAction.java | 122 +++++++++++++++-- .../tracepointactions/EvaluateAction.java | 16 ++- .../MessagesForTracepointActions.java | 6 +- .../WhileSteppingAction.java | 16 ++- .../tracepointactions/messages.properties | 7 +- .../GDBRemoteTracepointsTest_7_0.java | 56 ++++---- .../GDBRemoteTracepointsTest_7_4.java | 50 +++++++ 11 files changed, 383 insertions(+), 68 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/CollectActionPage.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/CollectActionPage.java index 1f6201c7d01..10f72c60a1d 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/CollectActionPage.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/CollectActionPage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Ericsson and others. + * Copyright (c) 2010, 2012 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Ericsson - initial API and implementation + * Marc Khouzam (Ericsson) - Added support for collecting char pointers as strings (bug 373707) *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.ui.tracepointactions; @@ -14,9 +15,16 @@ import org.eclipse.cdt.debug.core.breakpointactions.IBreakpointAction; import org.eclipse.cdt.debug.ui.breakpointactions.IBreakpointActionPage; import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.CollectAction; import org.eclipse.core.runtime.PlatformObject; +import org.eclipse.jface.fieldassist.ControlDecoration; +import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; @@ -26,7 +34,20 @@ import org.eclipse.swt.widgets.Text; */ public class CollectActionPage extends PlatformObject implements IBreakpointActionPage { + /** + * An exception to indicate that the user-specified string limit is invalid + */ + private class IllegalCollectStringLimitException extends Exception { + private static final long serialVersionUID = -2087722354642237691L; + public IllegalCollectStringLimitException(String message) { + super(message); + } + } + private Text fCollectString; + private Button fTreatCharPtrAsStrings; + private Text fTreatCharPtrAsStringsLimit; + private CollectAction fCollectAction; /** @@ -36,14 +57,73 @@ public class CollectActionPage extends PlatformObject implements IBreakpointActi Composite composite = new Composite(parent, style); composite.setLayout(new GridLayout(2, false)); + // The label asking for what to collect final Label collectLabel = new Label(composite, SWT.NONE); collectLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); collectLabel.setText(MessagesForTracepointActions.TracepointActions_Collect_Label); + // The user-specified string of what to collect fCollectString = new Text(composite, SWT.BORDER); fCollectString.setText(fCollectAction.getCollectString()); - fCollectString.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + fCollectString.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); + // An option to collect character pointers as strings + fTreatCharPtrAsStrings = new Button(composite, SWT.CHECK); + GridData gd = new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1); + gd.verticalIndent = 15; + // Store the button width before we add the text as we only care about the checkbox width + int buttonWidth = fTreatCharPtrAsStrings.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; + fTreatCharPtrAsStrings.setText(MessagesForTracepointActions.TracepointActions_Collect_Strings_Label); + fTreatCharPtrAsStrings.setLayoutData(gd); + fTreatCharPtrAsStrings.setSelection(fCollectAction.getCharPtrAsStrings()); + fTreatCharPtrAsStrings.addSelectionListener(new SelectionListener() { + @Override + public void widgetSelected(SelectionEvent e) { + // Disable/enable the limit field + fTreatCharPtrAsStringsLimit.setEnabled(fTreatCharPtrAsStrings.getSelection()); + } + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // Disable/enable the limit field + fTreatCharPtrAsStringsLimit.setEnabled(fTreatCharPtrAsStrings.getSelection()); + } + }); + + // A label asking for an optional limit of bytes of collected strings + final Label limitLabel = new Label(composite, SWT.NONE); + gd = new GridData(SWT.CENTER, SWT.CENTER, false, false); + gd.horizontalIndent = buttonWidth; + limitLabel.setLayoutData(gd); + limitLabel.setText(MessagesForTracepointActions.TracepointActions_Collect_Strings_Limit_Label); + + // A user-specified limit of bytes + fTreatCharPtrAsStringsLimit = new Text(composite, SWT.BORDER); + fTreatCharPtrAsStringsLimit.setText(getCharPtrAsStringLimit(fCollectAction.getCharPtrAsStringsLimit())); + + gd = new GridData(SWT.FILL, SWT.CENTER, false, false); + gd.horizontalIndent = FieldDecorationRegistry.getDefault().getMaximumDecorationWidth(); + fTreatCharPtrAsStringsLimit.setLayoutData(gd); + fTreatCharPtrAsStringsLimit.setEnabled(fTreatCharPtrAsStrings.getSelection()); + + final ControlDecoration decoration = new ControlDecoration(fTreatCharPtrAsStringsLimit, SWT.TOP | SWT.LEFT, composite ); + decoration.hide(); + fTreatCharPtrAsStringsLimit.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + try { + getCharPtrAsStringLimit(fTreatCharPtrAsStringsLimit.getText()); + decoration.hide(); + } catch (IllegalCollectStringLimitException exception) { + decoration.setImage( + FieldDecorationRegistry.getDefault().getFieldDecoration( + FieldDecorationRegistry.DEC_ERROR).getImage()); + decoration.setDescriptionText(exception.getMessage()); + decoration.show(); + } + } + }); + + return composite; } @@ -58,6 +138,14 @@ public class CollectActionPage extends PlatformObject implements IBreakpointActi @Override public void actionDialogOK() { fCollectAction.setCollectString(fCollectString.getText()); + fCollectAction.setCharPtrAsStrings(fTreatCharPtrAsStrings.getSelection()); + + try { + Integer limit = getCharPtrAsStringLimit(fTreatCharPtrAsStringsLimit.getText()); + fCollectAction.setCharPtrAsStringsLimit(limit); + } catch (IllegalCollectStringLimitException e) { + // ignore and keep old value + } } @Override @@ -66,4 +154,37 @@ public class CollectActionPage extends PlatformObject implements IBreakpointActi return createCollectActionComposite(composite, style); } + /** + * Convert the user-specified string into an integer. + * If the string is not valid, disable the limit by using null. + * @param limitStr The string provided by the user + * @return An non-negative integer limit, or null for no limit. + */ + private Integer getCharPtrAsStringLimit(String limitStr) throws IllegalCollectStringLimitException { + limitStr = limitStr.trim(); + Integer limit = null; + try { + limit = Integer.parseInt(limitStr); + if (limit < 0) { + throw new IllegalCollectStringLimitException(MessagesForTracepointActions.TracepointActions_Collect_Strings_Limit_Error); + } + } catch (NumberFormatException e) { + if (!limitStr.isEmpty()) { + // We only accept an empty string, which means no limit + throw new IllegalCollectStringLimitException(MessagesForTracepointActions.TracepointActions_Collect_Strings_Limit_Error); + } + } + return limit; + } + + /** + * Convert the integer limit into a string. + * If the string is not valid, disable the limit by using null. + * @param limit The integer limit to convert. Can be null for no limit. + * @return The limit as a string, where no limit or a negative limit is the empty string. + */ + private String getCharPtrAsStringLimit(Integer limit) { + if (limit == null || limit < 0) return ""; //$NON-NLS-1$ + return Integer.toString(limit); + } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/MessagesForTracepointActions.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/MessagesForTracepointActions.java index 720a95260c1..03ecb9dec58 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/MessagesForTracepointActions.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/MessagesForTracepointActions.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Ericsson and others. + * Copyright (c) 2010, 2012 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Ericsson - initial API and implementation + * Marc Khouzam (Ericsson) - Added support for collecting char pointers as strings (bug 373707) *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.ui.tracepointactions; @@ -39,6 +40,9 @@ class MessagesForTracepointActions extends NLS { public static String TracepointActions_Collect_Label; public static String TracepointActions_Evaluate_Label; public static String TracepointActions_WhileStepping_Sub_Actions; + public static String TracepointActions_Collect_Strings_Label; + public static String TracepointActions_Collect_Strings_Limit_Label; + public static String TracepointActions_Collect_Strings_Limit_Error; static { // initialize resource bundle diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/messages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/messages.properties index f4e71343260..97b30e33ba3 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/messages.properties +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/messages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2010 Ericsson and others. +# Copyright (c) 2010, 2012 Ericsson and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ # # Contributors: # Ericsson - initial API and implementation +# Marc Khouzam (Ericsson) - Added support for collecting char pointers as strings (bug 373707) ############################################################################### TracepointActions_Actions_for_this_tracepoint=Actions for this tracepoint: @@ -29,3 +30,6 @@ TracepointActions_ActionDialog_Type=Action type: TracepointActions_Collect_Label=Data to collect (comma-separated list): TracepointActions_Evaluate_Label=Expressions to evaluate (comma-separated list): TracepointActions_WhileStepping_Sub_Actions=Sub-actions for While-stepping +TracepointActions_Collect_Strings_Label=Collect all character pointers as strings +TracepointActions_Collect_Strings_Limit_Label=with optional string size limit (bytes): +TracepointActions_Collect_Strings_Limit_Error=Only non-negative integers can be used. Current value will be ignored. diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/GdbPlugin.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/GdbPlugin.java index 0d4236890e2..9508e27d78f 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/GdbPlugin.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/GdbPlugin.java @@ -159,4 +159,45 @@ public class GdbPlugin extends Plugin { return traceBuilder.toString(); } + /** + * Convenience method which returns the unique identifier of this plugin. + */ + public static String getUniqueIdentifier() { + if (getDefault() == null) { + // If the default instance is not yet initialized, + // return a static identifier. This identifier must + // match the plugin id defined in plugin.xml + return PLUGIN_ID; + } + return getDefault().getBundle().getSymbolicName(); + } + + /** + * Logs the specified status with this plug-in's log. + * + * @param status + * status to log + */ + public static void log(IStatus status) { + getDefault().getLog().log(status); + } + /** + * Logs an internal error with the specified message. + * + * @param message + * the error message to log + */ + public static void logErrorMessage(String message) { + log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null)); + } + + /** + * Logs an internal error with the specified throwable + * + * @param e + * the exception to be logged + */ + public static void log(Throwable e) { + log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e)); + } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/CollectAction.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/CollectAction.java index b69eba9985a..cf4bc8b06ef 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/CollectAction.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/CollectAction.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Ericsson and others. + * Copyright (c) 2010, 2012 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Ericsson - initial API and implementation + * Marc Khouzam (Ericsson) - Added support for collecting char pointers as strings (bug 373707) *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.tracepointactions; @@ -21,21 +22,43 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.InputSource; import org.xml.sax.helpers.DefaultHandler; -import com.ibm.icu.text.MessageFormat; - /** + * Action used to tell GDB to collect different values from a tracepoint. + * It corresponds to GDB's 'collect' action. + * + * As for GDB 7.4: + * collect[/s] EXPRESSIONS + * The tracepoint collect command now takes an optional modifier "/s" + * that directs it to dereference pointer-to-character types and + * collect the bytes of memory up to a zero byte. The behavior is + * similar to what you see when you use the regular print command on a + * string. An optional integer following the "/s" sets a bound on the + * number of bytes that will be collected. + * * @since 3.0 */ public class CollectAction extends AbstractTracepointAction { private static final String COLLECT_ACTION_ID = "org.eclipse.cdt.dsf.gdb.tracepointactions.CollectAction"; //$NON-NLS-1$ + private static final String COLLECT_ACTION_ELEMENT_NAME = "collectData"; //$NON-NLS-1$ + private static final String COLLECT_STRING_ATTR = "collectString"; //$NON-NLS-1$ + private static final String COLLECT_AS_STRING_ATTR = "collectAsString"; //$NON-NLS-1$ + private static final String COLLECT_AS_STRING_LIMIT_ATTR = "collectAsStringLimit"; //$NON-NLS-1$ private String fCollectString = ""; //$NON-NLS-1$ + /** Indicates if we should ask GDB to collect character pointers as strings */ + private boolean fCharPtrAsStrings; + /** + * Optional limit of the size of the string to collect for character pointers. + * Null will indicate that no limit is to be used. + * This value should be non-negative. */ + private Integer fCharPtrAsStringsLimit; @Override public String getDefaultName() { @@ -50,6 +73,45 @@ public class CollectAction extends AbstractTracepointAction { fCollectString = str; } + /** + * Indicates if this collect action will treat character pointers as strings. + * @since 4.1 + */ + public boolean getCharPtrAsStrings() { + return fCharPtrAsStrings; + } + + /** + * Specify if this collect action should treat character pointers as strings. + * @since 4.1 + */ + public void setCharPtrAsStrings(boolean enable) { + fCharPtrAsStrings = enable; + } + + /** + * Indicates the maximum number of bytes that should be collected + * when treating character pointers as strings + * @return null if no limit is to be used + * @return a non-negative integer indicating the limit + * + * @since 4.1 + */ + public Integer getCharPtrAsStringsLimit() { + return fCharPtrAsStringsLimit; + } + + /** + * Specify the maximum number of bytes that should be collected when + * when treating character pointers as strings. + * @param limit A non-negative integer, or null of no limit should be used. + * + * @since 4.1 + */ + public void setCharPtrAsStringsLimit(Integer limit) { + fCharPtrAsStringsLimit = limit; + } + @Override public String getIdentifier() { return COLLECT_ACTION_ID; @@ -65,8 +127,12 @@ public class CollectAction extends AbstractTracepointAction { docBuilder = dfactory.newDocumentBuilder(); Document doc = docBuilder.newDocument(); - Element rootElement = doc.createElement("collectData"); //$NON-NLS-1$ - rootElement.setAttribute("collectString", fCollectString); //$NON-NLS-1$ + Element rootElement = doc.createElement(COLLECT_ACTION_ELEMENT_NAME); + + // Store the different attributes of this collect action + rootElement.setAttribute(COLLECT_STRING_ATTR, fCollectString); + rootElement.setAttribute(COLLECT_AS_STRING_ATTR, Boolean.toString(fCharPtrAsStrings)); + rootElement.setAttribute(COLLECT_AS_STRING_LIMIT_ATTR, fCharPtrAsStringsLimit == null ? "" : fCharPtrAsStringsLimit.toString()); //$NON-NLS-1$ doc.appendChild(rootElement); @@ -84,14 +150,29 @@ public class CollectAction extends AbstractTracepointAction { collectData = s.toString("UTF8"); //$NON-NLS-1$ } catch (Exception e) { - e.printStackTrace(); + GdbPlugin.log(e); } return collectData; } @Override public String getSummary() { - return MessageFormat.format(MessagesForTracepointActions.TracepointActions_Collect_text, new Object[] { fCollectString }); + // Return the exact format that will be sent to GDB. + + StringBuffer collectCmd = new StringBuffer("collect "); //$NON-NLS-1$ + if (fCharPtrAsStrings) { + collectCmd.append("/s"); //$NON-NLS-1$ + if (fCharPtrAsStringsLimit != null) { + // No space between /s and the limit + collectCmd.append(fCharPtrAsStringsLimit.toString()); + } + // Now add the space before we append what to collect. + collectCmd.append(" "); //$NON-NLS-1$ + } + // Finally, actually add what to collect + collectCmd.append(fCollectString); + + return collectCmd.toString(); } @Override @@ -107,16 +188,33 @@ public class CollectAction extends AbstractTracepointAction { parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); parser.setErrorHandler(new DefaultHandler()); root = parser.parse(new InputSource(new StringReader(data))).getDocumentElement(); - fCollectString = root.getAttribute("collectString"); //$NON-NLS-1$ - if (fCollectString == null) - throw new Exception(); + + fCollectString = root.getAttribute(COLLECT_STRING_ATTR); + if (fCollectString == null) fCollectString = ""; //$NON-NLS-1$ + + String asStrings = root.getAttribute(COLLECT_AS_STRING_ATTR); + if (asStrings != null) { + fCharPtrAsStrings = Boolean.valueOf(asStrings); + } else { + fCharPtrAsStrings = false; + } + + fCharPtrAsStringsLimit = null; + String asStringsLimit = root.getAttribute(COLLECT_AS_STRING_LIMIT_ATTR); + if (asStringsLimit != null) { + try { + fCharPtrAsStringsLimit = Integer.valueOf(asStringsLimit); + } catch (NumberFormatException e) { + // leave as null to disable + } + } } catch (Exception e) { - e.printStackTrace(); + GdbPlugin.log(e); } } @Override public String toString() { - return MessageFormat.format(MessagesForTracepointActions.TracepointActions_Collect_text, new Object[] { fCollectString }); + return getSummary(); } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/EvaluateAction.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/EvaluateAction.java index da8a8a7574a..94b717451ea 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/EvaluateAction.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/EvaluateAction.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Ericsson and others. + * Copyright (c) 2010, 2012 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,8 @@ * * Contributors: * Ericsson - initial API and implementation + * Marc Khouzam (Ericsson) - Don't use translatable strings for the command summary + * since it will be send directly to GDB *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.tracepointactions; @@ -21,13 +23,12 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.InputSource; import org.xml.sax.helpers.DefaultHandler; -import com.ibm.icu.text.MessageFormat; - /** * @since 3.0 */ @@ -83,14 +84,15 @@ public class EvaluateAction extends AbstractTracepointAction { collectData = s.toString("UTF8"); //$NON-NLS-1$ } catch (Exception e) { - e.printStackTrace(); + GdbPlugin.log(e); } return collectData; } @Override public String getSummary() { - return MessageFormat.format(MessagesForTracepointActions.TracepointActions_Evaluate_text, new Object[] { fEvalString }); + // Create command to be sent to GDB + return String.format("teval %s", fEvalString); //$NON-NLS-1$ } @Override @@ -110,12 +112,12 @@ public class EvaluateAction extends AbstractTracepointAction { if (fEvalString == null) throw new Exception(); } catch (Exception e) { - e.printStackTrace(); + GdbPlugin.log(e); } } @Override public String toString() { - return MessageFormat.format(MessagesForTracepointActions.TracepointActions_Evaluate_text, new Object[] { fEvalString }); + return getSummary(); } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/MessagesForTracepointActions.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/MessagesForTracepointActions.java index 72ace6d2136..cbf8218f9f1 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/MessagesForTracepointActions.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/MessagesForTracepointActions.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Ericsson and others. + * Copyright (c) 2010, 2012 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Ericsson - initial API and implementation + * Marc Khouzam (Ericsson) - Remove strings that should not be translated *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.tracepointactions; @@ -25,9 +26,6 @@ class MessagesForTracepointActions extends NLS { public static String TracepointActions_Collect_Name; public static String TracepointActions_Evaluate_Name; public static String TracepointActions_WhileStepping_Name; - public static String TracepointActions_Collect_text; - public static String TracepointActions_Evaluate_text; - public static String TracepointActions_WhileStepping_text; static { // initialize resource bundle diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/WhileSteppingAction.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/WhileSteppingAction.java index 8c509cd5267..f5e812f1e40 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/WhileSteppingAction.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/WhileSteppingAction.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Ericsson and others. + * Copyright (c) 2010, 2012 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,8 @@ * * Contributors: * Ericsson - initial API and implementation + * Marc Khouzam (Ericsson) - Don't use translatable strings for the command summary + * since it will be send directly to GDB *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.tracepointactions; @@ -21,13 +23,12 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.InputSource; import org.xml.sax.helpers.DefaultHandler; -import com.ibm.icu.text.MessageFormat; - /** * @since 3.0 */ @@ -120,14 +121,15 @@ public class WhileSteppingAction extends AbstractTracepointAction { collectData = s.toString("UTF8"); //$NON-NLS-1$ } catch (Exception e) { - e.printStackTrace(); + GdbPlugin.log(e); } return collectData; } @Override public String getSummary() { - return MessageFormat.format(MessagesForTracepointActions.TracepointActions_WhileStepping_text, new Object[] { fStepCount, fSubActionContent }); + // Create command to be sent to GDB + return String.format("while-stepping %s %s", fStepCount, fSubActionContent); //$NON-NLS-1$ } @Override @@ -149,12 +151,12 @@ public class WhileSteppingAction extends AbstractTracepointAction { throw new Exception(); setSubActionsContent(fSubActionNames); } catch (Exception e) { - e.printStackTrace(); + GdbPlugin.log(e); } } @Override public String toString() { - return MessageFormat.format(MessagesForTracepointActions.TracepointActions_WhileStepping_text, new Object[] { fStepCount, fSubActionContent }); + return getSummary(); } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/messages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/messages.properties index 8ab0c0f533a..3d496c75aa1 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/messages.properties +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/tracepointactions/messages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2010 Ericsson and others. +# Copyright (c) 2010, 2012 Ericsson and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at @@ -16,8 +16,3 @@ TracepointActions_Untitled_WhileStepping=Untitled While-Stepping Action TracepointActions_Collect_Name=Collect Action TracepointActions_Evaluate_Name=Evaluate Action TracepointActions_WhileStepping_Name=While-Stepping Action -# START NON-TRANSLATABLE -TracepointActions_Collect_text=collect {0} -TracepointActions_Evaluate_text=teval {0} -TracepointActions_WhileStepping_text=while-stepping {0} {1} -# END NON-TRANSLATABLE diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/tests_7_0/GDBRemoteTracepointsTest_7_0.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/tests_7_0/GDBRemoteTracepointsTest_7_0.java index 84f60e59ea5..1068854289a 100644 --- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/tests_7_0/GDBRemoteTracepointsTest_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/tests_7_0/GDBRemoteTracepointsTest_7_0.java @@ -68,33 +68,33 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_NORMAL); } - private DsfSession fSession; - private DsfServicesTracker fServicesTracker; - private IBreakpoints fBreakpointService; + protected DsfSession fSession; + protected DsfServicesTracker fServicesTracker; + protected IBreakpoints fBreakpointService; // private ITraceControl fTraceService; - private IBreakpointsTargetDMContext fBreakpointsDmc; + protected IBreakpointsTargetDMContext fBreakpointsDmc; // private ITraceTargetDMContext fTraceTargetDmc; // private int fTotalTracingBufferSize = 0; - private static final String SOURCE_FILE = "TracepointTestApp.cc"; - private static final String METHOD_NAME = "testTracepoints"; - private static final int LINE_NUMBER_1 = 97; - private static final int LINE_NUMBER_2 = 75; - private static final int LINE_NUMBER_3 = 76; - private static final int LINE_NUMBER_4 = 85; - private static final int LINE_LOOP_2 = 109; - private static final String NO_CONDITION = ""; - private static final String NO_COMMANDS = ""; + protected static final String SOURCE_FILE = "TracepointTestApp.cc"; + protected static final String METHOD_NAME = "testTracepoints"; + protected static final int LINE_NUMBER_1 = 97; + protected static final int LINE_NUMBER_2 = 75; + protected static final int LINE_NUMBER_3 = 76; + protected static final int LINE_NUMBER_4 = 85; + protected static final int LINE_LOOP_2 = 109; + protected static final String NO_CONDITION = ""; + protected static final String NO_COMMANDS = ""; // private static final int LAST_LINE_NUMBER = 94; // // private static final int TOTAL_FRAMES_TO_BE_COLLECTED = 1 + 1 + 10 + 1 + 10000; - private final static int[] PASS_COUNTS = {12, 2, 32, 6, 128, 0, 0, 0, 0, 0, 0, 0}; - private final static String[] CONDITIONS = {"gIntVar == 543", "gBoolVar == false", "counter == 3", "counter > 4", "counter > 2 && lIntVar == 12345"}; + protected final static int[] PASS_COUNTS = {12, 2, 32, 6, 128, 0, 0, 0, 0, 0, 0, 0}; + protected final static String[] CONDITIONS = {"gIntVar == 543", "gBoolVar == false", "counter == 3", "counter > 4", "counter > 2 && lIntVar == 12345"}; - private static CollectAction[] COLLECT_ACTIONS = new CollectAction[10]; - private static EvaluateAction[] EVAL_ACTIONS = new EvaluateAction[10]; + protected static CollectAction[] COLLECT_ACTIONS = new CollectAction[10]; + protected static EvaluateAction[] EVAL_ACTIONS = new EvaluateAction[10]; // private static WhileSteppingAction[] STEPPING_ACTION_1 = new WhileSteppingAction[3]; static { @@ -248,7 +248,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { } // Clears the counters - private void clearEventCounters() { + protected void clearEventCounters() { synchronized (lock) { for (int i = 0; i < fBreakpointEvents.length; i++) { fBreakpointEvents[i] = 0; @@ -259,7 +259,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { } // Get the breakpoint hit count - private int getBreakpointEventCount(int event) { + protected int getBreakpointEventCount(int event) { int count = 0; synchronized (lock) { count = fBreakpointEvents[event]; @@ -269,7 +269,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { // Suspends the thread until an event is flagged // NOTE: too simple for real life but good enough for this test suite - private void waitForBreakpointEvent() { + protected void waitForBreakpointEvent() { synchronized (lock) { while (!fBreakpointEvent) { try { @@ -291,7 +291,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { // Breakpoint service methods (to use with tracepoints). // ********************************************************************* - private IBreakpointDMContext insertBreakpoint(final IBreakpointsTargetDMContext context, + protected IBreakpointDMContext insertBreakpoint(final IBreakpointsTargetDMContext context, final Map attributes) throws InterruptedException { final AsyncCompletionWaitor wait = new AsyncCompletionWaitor(); @@ -317,7 +317,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { return (IBreakpointDMContext)wait.getReturnInfo(); } - private void removeBreakpoint(final IBreakpointDMContext breakpoint) throws InterruptedException + protected void removeBreakpoint(final IBreakpointDMContext breakpoint) throws InterruptedException { final AsyncCompletionWaitor wait = new AsyncCompletionWaitor(); @@ -338,7 +338,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { assertTrue(wait.getMessage(), wait.isOK()); } - private void updateBreakpoint(final IBreakpointDMContext breakpoint, + protected void updateBreakpoint(final IBreakpointDMContext breakpoint, final Map delta) throws InterruptedException { final AsyncCompletionWaitor wait = new AsyncCompletionWaitor(); @@ -360,7 +360,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { assertTrue(wait.getMessage(), wait.isOK()); } - private IBreakpointDMData getBreakpoint(final IBreakpointDMContext breakpoint) throws InterruptedException + protected IBreakpointDMData getBreakpoint(final IBreakpointDMContext breakpoint) throws InterruptedException { final AsyncCompletionWaitor wait = new AsyncCompletionWaitor(); @@ -384,7 +384,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { return (IBreakpointDMData)wait.getReturnInfo(); } - private IBreakpointDMContext[] getBreakpoints(final IBreakpointsTargetDMContext context) throws InterruptedException + protected IBreakpointDMContext[] getBreakpoints(final IBreakpointsTargetDMContext context) throws InterruptedException { final AsyncCompletionWaitor wait = new AsyncCompletionWaitor(); @@ -550,7 +550,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { // Below are the tests for the control of tracepoints. // ********************************************************************* - private IBreakpointDMContext[] fTracepoints = null; + protected IBreakpointDMContext[] fTracepoints = null; // private void checkTraceStatus(boolean supported, boolean active, int frames, // STOP_REASON_ENUM reason, Integer stoppingTracepoint) throws Throwable { @@ -592,7 +592,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { // GDB 7.0 does not support fast tracepoints, but GDB 7.2 will protected boolean fastTracepointsSupported() { return false; } - private class TracepointData { + protected class TracepointData { String sourceFile; int lineNumber; String condition; @@ -616,7 +616,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase { } } - private void checkTracepoints(TracepointData[] dataArray) throws Throwable { + protected void checkTracepoints(TracepointData[] dataArray) throws Throwable { int numTracepoints = dataArray.length; // Fetch the tp list from the backend diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/tests_7_4/GDBRemoteTracepointsTest_7_4.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/tests_7_4/GDBRemoteTracepointsTest_7_4.java index 2c9e21aa832..23f22aee96b 100644 --- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/tests_7_4/GDBRemoteTracepointsTest_7_4.java +++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/tests_7_4/GDBRemoteTracepointsTest_7_4.java @@ -11,10 +11,18 @@ package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_4; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.CollectAction; +import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.TracepointActionManager; +import org.eclipse.cdt.dsf.mi.service.MIBreakpoints; import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner; import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants; import org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_3.GDBRemoteTracepointsTest_7_3; import org.junit.BeforeClass; +import org.junit.Test; import org.junit.runner.RunWith; @RunWith(BackgroundRunner.class) @@ -30,4 +38,46 @@ public class GDBRemoteTracepointsTest_7_4 extends GDBRemoteTracepointsTest_7_3 { // instruction of 4 bytes or more, instead of 5. return true; } + + /** + * This test sets the different types of tracepoints and then sets some string collection actions + */ + @Test + public void tracepointActionsWithCollectStrings() throws Throwable { + TracepointActionManager tracepointActionMgr = TracepointActionManager.getInstance(); + + CollectAction action1 = new CollectAction(); + action1.setCollectString("/s $locals"); + action1.setName("Collect string locals"); + tracepointActionMgr.addAction(action1); + + CollectAction action2 = new CollectAction(); + action2.setCollectString("/s3 $locals, $reg"); + action2.setName("Collect string locals, reg"); + tracepointActionMgr.addAction(action2); + + createTracepoints(); + + Map delta = new HashMap(); + // Set conditions for all tracepoints + delta.put(MIBreakpoints.COMMANDS, action1.getName()); + updateBreakpoint(fTracepoints[0], delta); + delta.put(MIBreakpoints.COMMANDS, action2.getName()); + updateBreakpoint(fTracepoints[1], delta); + delta.put(MIBreakpoints.COMMANDS, action1.getName()); + updateBreakpoint(fTracepoints[2], delta); + delta.put(MIBreakpoints.COMMANDS, action1.getName()); + updateBreakpoint(fTracepoints[3], delta); + delta.put(MIBreakpoints.COMMANDS, action2.getName()); + updateBreakpoint(fTracepoints[4], delta); + + ArrayList dataArray = new ArrayList(); + dataArray.add(new TracepointData(SOURCE_FILE, LINE_NUMBER_2, NO_CONDITION, 0, true, action1.toString(), false)); + dataArray.add(new TracepointData(SOURCE_FILE, LINE_NUMBER_3, NO_CONDITION, 0, true, action2.toString(), false)); + dataArray.add(new TracepointData(SOURCE_FILE, LINE_NUMBER_4, NO_CONDITION, 0, true, action1.toString(), true)); + dataArray.add(new TracepointData(SOURCE_FILE, LINE_NUMBER_1, NO_CONDITION, 0, true, action1.toString(), true)); + dataArray.add(new TracepointData(SOURCE_FILE, LINE_LOOP_2, NO_CONDITION, 0, true, action2.toString(), acceptsFastTpOnFourBytes())); + + checkTracepoints(dataArray.toArray(new TracepointData[dataArray.size()])); + } }