diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/breakpoints/ToggleDynamicPrintfAdapter.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/breakpoints/ToggleDynamicPrintfAdapter.java index f8525e03205..6e24a6ff6e8 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/breakpoints/ToggleDynamicPrintfAdapter.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/breakpoints/ToggleDynamicPrintfAdapter.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.debug.internal.ui.actions.breakpoints; import java.util.HashMap; import java.util.Map; +import java.util.regex.Pattern; import org.eclipse.cdt.debug.core.CDIDebugModel; import org.eclipse.cdt.debug.core.model.ICBreakpointType; @@ -51,12 +52,12 @@ public class ToggleDynamicPrintfAdapter extends AbstractToggleBreakpointAdapter // Although the user will be given the opportunity to provide the printf string // in the properties dialog, we pre-fill it with the default string to be nice attributes.put(ICDynamicPrintf.PRINTF_STRING, - NLS.bind(Messages.Default_LineDynamicPrintf_String, sourceHandle, lineNumber)); + NLS.bind(Messages.Default_LineDynamicPrintf_String, escapeBackslashes(sourceHandle), lineNumber)); openBreakpointPropertiesDialog(dprintf, part, resource, attributes); } else { // We provide a default printf string to make the dynamic printf useful automatically - String printfStr = NLS.bind(Messages.Default_LineDynamicPrintf_String, sourceHandle, lineNumber); + String printfStr = NLS.bind(Messages.Default_LineDynamicPrintf_String, escapeBackslashes(sourceHandle), lineNumber); CDIDebugModel.createLineDynamicPrintf( sourceHandle, resource, getBreakpointType(), lineNumber, true, 0, "", printfStr, true );//$NON-NLS-1$ @@ -83,13 +84,13 @@ public class ToggleDynamicPrintfAdapter extends AbstractToggleBreakpointAdapter dprintf.setPrintfString(NLS.bind(Messages.Default_FunctionDynamicPrintf_String, sourceHandle, functionName)); openBreakpointPropertiesDialog(dprintf, part, resource, attributes); - } else { + } else { // We provide a default printf string to make the dynamic printf useful automatically String printfStr = NLS.bind(Messages.Default_FunctionDynamicPrintf_String, sourceHandle, functionName); CDIDebugModel.createFunctionDynamicPrintf(sourceHandle, resource, getBreakpointType(), functionName, charStart, charEnd, lineNumber, true, 0, "", printfStr, true); //$NON-NLS-1$ - } + } } @Override @@ -102,7 +103,8 @@ public class ToggleDynamicPrintfAdapter extends AbstractToggleBreakpointAdapter return false; } - protected void createWatchpoint( boolean interactive, IWorkbenchPart part, String sourceHandle, IResource resource, + @Override + protected void createWatchpoint( boolean interactive, IWorkbenchPart part, String sourceHandle, IResource resource, int charStart, int charEnd, int lineNumber, String expression, String memorySpace, String range) throws CoreException { } @@ -121,4 +123,12 @@ public class ToggleDynamicPrintfAdapter extends AbstractToggleBreakpointAdapter protected int getBreakpointType() { return ICBreakpointType.REGULAR; } + + /** + * Escape embedded backslashes for inclusion in C string. + */ + private static String escapeBackslashes(String str) { + return str.replaceAll(Pattern.quote("\\"), "\\\\\\\\"); //$NON-NLS-1$//$NON-NLS-2$ + } + } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/breakpoints/DisassemblyToggleDynamicPrintfTarget.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/breakpoints/DisassemblyToggleDynamicPrintfTarget.java index 109c8055a1a..8f3928b04bc 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/breakpoints/DisassemblyToggleDynamicPrintfTarget.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/breakpoints/DisassemblyToggleDynamicPrintfTarget.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.dsf.gdb.internal.ui.breakpoints; import java.util.HashMap; import java.util.Map; +import java.util.regex.Pattern; import org.eclipse.cdt.core.IAddress; import org.eclipse.cdt.debug.core.CDIDebugModel; @@ -34,7 +35,7 @@ public class DisassemblyToggleDynamicPrintfTarget extends AbstractDisassemblyBre @Override protected void createLineBreakpoint(String sourceHandle, IResource resource, int lineNumber) throws CoreException { // We provide a default printf string to make the dynamic printf useful automatically - String printfStr = NLS.bind(Messages.Default_LineDynamicPrintf_String, sourceHandle, lineNumber); + String printfStr = NLS.bind(Messages.Default_LineDynamicPrintf_String, escapeBackslashes(sourceHandle), lineNumber); CDIDebugModel.createLineDynamicPrintf(sourceHandle, resource, getBreakpointType(), lineNumber, true, 0, "", printfStr, true); //$NON-NLS-1$ } @@ -51,7 +52,7 @@ public class DisassemblyToggleDynamicPrintfTarget extends AbstractDisassemblyBre // Although the user will be given the opportunity to provide the printf string // in the properties dialog, we pre-fill it with the default string to be nice. attributes.put(ICDynamicPrintf.PRINTF_STRING, - NLS.bind(Messages.Default_LineDynamicPrintf_String, sourceHandle, lineNumber)); + NLS.bind(Messages.Default_LineDynamicPrintf_String, escapeBackslashes(sourceHandle), lineNumber)); openBreakpointPropertiesDialog(dprintf, part, resource, attributes); } @@ -87,4 +88,12 @@ public class DisassemblyToggleDynamicPrintfTarget extends AbstractDisassemblyBre protected int getBreakpointType() { return ICBreakpointType.REGULAR; } + + /** + * Escape embedded backslashes for inclusion in C string. + */ + private static String escapeBackslashes(String str) { + return str.replaceAll(Pattern.quote("\\"), "\\\\\\\\"); //$NON-NLS-1$//$NON-NLS-2$ + } + }