使用断点从函数返回

本文关键字:函数 返回 断点 | 更新日期: 2023-09-27 18:20:50

是否可以使用断点/跟踪点从函数自动返回
我不想每次遇到断点时都拖动执行点或用CTRL+SHIFT+F10设置它
当命中时,我尝试"打印"以下"消息",但执行仍在继续,没有任何变化。

{return;}
{return null;}

请注意,我需要从函数返回,而不需要实际更改代码。

要澄清什么是跟踪点:"跟踪点是一个断点,带有与之相关的自定义操作。当跟踪点被命中时,调试器将执行指定的跟踪点操作,而不是中断程序执行,或者除了中断程序执行之外。"来自MSDN。

如果你不知道我说的"打印消息"是什么意思,你可能想读一下这篇关于Tracepoints的AltDevBlogADay帖子。这很好。

使用断点从函数返回

在Visual Studio中,您只需将指示调试时当前代码行的箭头拖动到函数的末尾即可。

好吧,经过一番挖掘,可以做到这一点,但这并不是在所有情况下都有效。

注意,这使用了宏,并且不能保证与内联委托一起工作;或者使用实际需要返回的方法。当遇到断点时,它会自动执行@juergen d和@Erno描述的过程;使用非常简单的启发式方法来找到当前函数的末尾。

您首先需要将此宏添加到宏环境中(在VS中用ALT+F11打开)。这个代码可能没有我刚才匆忙发布的那么好:)

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

有了它,现在您可以设置断点——右键单击它并点击When hit...菜单选项(我相信这只适用于VS2010)。ScottGu在这篇博客文章中描述了这一点。

从对话框中,找到刚刚粘贴的ExitStack宏。

在附加调试器的情况下运行代码,当遇到断点时,应跳过函数的其余代码。这应该遵守其他调试器技巧,比如条件等。

注意-我用这个SO来解决我遇到的一个问题;最初我直接调用调试器的SetNextStatement方法,但它不起的作用

我不知道应该返回的方法会如何表现——理论上,无论返回值是本地的,它们都应该返回,但在某些情况下,事实是这根本不起作用!

同样,如果断点在try/catch块中,那么它也不会工作,因为在将下一条语句设置到它之外的某个位置之前,必须退出try/catch

两个选项:

  1. 如果您希望函数在返回调用方后完成执行并中断。按下"退出"(换档-F11)
  2. 如果要跳过几行的执行,请将黄色标记拖动到要执行的下一行。请记住,将标记拖动到某个位置可能会导致执行顺序,而在不干扰的情况下运行时,执行顺序永远不会发生,因此结果可能完全错误

是的,您可以使用跟踪点直接执行此操作。

  1. 在函数底部查找return语句的地址,方法是打断它一次,然后在Registers(寄存器)窗口中查看EIP寄存器,或者添加一个Watch for"@EIP"
  2. 将跟踪点添加到要从中跳转的行。请记住,在执行行上的任何内容之前,都会发生跳转。跟踪点的内容应该是使用步骤1中的地址的{@eip = address}
  3. 利润

另请参阅https://stackoverflow.com/a/14695736/301729