Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return from a function using a breakpoint

Is it possible to automatically return from a function using a Breakpoint/Tracepoint?
I don't want to drag the execution point or set it with CTRL+SHIFT+F10 every time the breakpoint is hit.
I tried "printing" the following "messages" When Hit, but the executions continue without change.

{return;}
{return null;}

Note that I need to return from the function without actually changing code.

To clarify what a Tracepoint is: "A tracepoint is a breakpoint with a custom action associated with it. When a tracepoint is hit, the debugger performs the specified tracepoint action instead of, or in addition to, breaking program execution." From MSDN.

If you don't know what I mean with "printing messages", you might want to read this AltDevBlogADay post about Tracepoints. It's good.

like image 803
Protector one Avatar asked Jan 19 '12 08:01

Protector one


People also ask

How do you continue after a breakpoint?

You can use breakpoint commands to start your program up again. Simply use the continue command, or step , or any other command that resumes execution. Any other commands in the command list, after a command that resumes execution, are ignored.

What is the point of a breakpoint?

Breakpoints are one of the most important debugging techniques in your developer's toolbox. You set breakpoints wherever you want to pause debugger execution. For example, you may want to see the state of code variables or look at the call stack at a certain breakpoint.

Is breakpoint before or after?

Breakpoint conditions Breakpoints are most commonly used to interrupt a running program immediately before the execution of a programmer-specified instruction. This is often referred to as an instruction breakpoint.

How do you set a breakpoint in C++?

To set a function breakpoint, on the Run view right-click inside the Breakpoints section, then choose Add Function Breakpoint and enter the name of the function on which you want to break execution.


2 Answers

In Visual Studio you could just drag the arrow, that indicates the current code line while debugging, to the end of the function.

like image 73
juergen d Avatar answered Sep 22 '22 01:09

juergen d


Okay, after a bit of digging around you can do this - but it's not going to work in all cases.

Beware, this uses macros and can't be guaranteed to work with inline delegates; or with methods that actually need to return something. It automates the process described by @juergen d and @Erno when a breakpoint is hit; using very simple heuristics to find where the end of the current function is.

You first need to add this macro to your macros environment (open with ALT+F11 in VS). This code is probably not as good as it could be as I've just rushed it out :)

Sub ExitStack()
    'get the last-hit breakpoint
    Dim breakPoint As EnvDTE.Breakpoint
    breakPoint = DTE.Debugger.BreakpointLastHit()
    'if the currently open file is the same as where the breakpoint is set
    '(could search and open it, but the debugger *should* already have done that)
    If (DTE.ActiveDocument.FullName = breakPoint.File) Then

        Dim selection As EnvDTE.TextSelection = DTE.ActiveDocument.Selection
        Dim editPoint As EnvDTE.EditPoint
        'move the cursor to where the breakpoint is actually defined
        selection.MoveToLineAndOffset(breakPoint.FileLine, breakPoint.FileColumn)

        Dim codeElement As EnvDTE.CodeElement
        codeElement = DTE.ActiveDocument.ProjectItem.FileCodeModel.CodeElementFromPoint(selection.ActivePoint, vsCMElement.vsCMElementFunction)
        'if a function is found, move the cursor to the last character of it
        If Not (codeElement Is Nothing) Then
            Dim lastLine As EnvDTE.TextPoint

            lastLine = codeElement.GetEndPoint()
            selection.MoveToPoint(lastLine)
            selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText)
            'execute the SetNextStatement command.  
            'Has to be done via ExecuteCommand
            DTE.ExecuteCommand("Debug.SetNextStatement")
        End If
    End If
End Sub

With that in place, now you can set your breakpoint - right click on it and hit the When hit... menu option (this only works in VS2010 I believe). ScottGu describes this in this blog post.

From the dialog, find the ExitStack macro that you've just pasted in.

Run the code with the debugger attached and when the breakpoint is hit the rest of the function's code should be skipped. This should obey other debugger tricks - like conditions etc.

Note - I used this SO to solve a problem I was having; originally I was invoking the debugger's SetNextStatement method directly and it didn't work

I have no idea how methods that should return will behave - in theory they should return whatever the return value local is at the time, but in some cases the fact is this simply won't work!

Equally if the breakpoint is in a try/catch block then it won't work - because the try/catch has to be exited before you can set the next statement to somewhere outside of it.

like image 45
Andras Zoltan Avatar answered Sep 19 '22 01:09

Andras Zoltan