Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用断点从函数返回_C#_Visual Studio_Debugging_Breakpoints - Fatal编程技术网

C# 使用断点从函数返回

C# 使用断点从函数返回,c#,visual-studio,debugging,breakpoints,C#,Visual Studio,Debugging,Breakpoints,是否可以使用断点/跟踪点从函数自动返回? 我不希望每次碰到断点时都拖动执行点或使用CTRL+SHIFT+F10设置它。 我试着在点击时“打印”下面的“消息”,但是执行过程没有改变 {return;} {return null;} 请注意,我需要从函数返回,而不实际更改代码 为了阐明什么是跟踪点:“跟踪点是一个断点,具有与之相关联的自定义操作。当跟踪点被命中时,调试器执行指定的跟踪点操作,而不是中断程序执行,或者除了中断程序执行之外。” 如果你不知道我说的“打印消息”是什么意思,你可能想读一下跟

是否可以使用断点/跟踪点从函数自动返回?
我不希望每次碰到断点时都拖动执行点或使用CTRL+SHIFT+F10设置它。
我试着在点击时“打印”下面的“消息”,但是执行过程没有改变

{return;}
{return null;}
请注意,我需要从函数返回,而不实际更改代码

为了阐明什么是跟踪点:“跟踪点是一个断点,具有与之相关联的自定义操作。当跟踪点被命中时,调试器执行指定的跟踪点操作,而不是中断程序执行,或者除了中断程序执行之外。”


如果你不知道我说的“打印消息”是什么意思,你可能想读一下跟踪点。这很好。

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

两个选项:

  • 如果希望函数在返回调用方后完成执行并中断。按下“步出”(Shift-F11)
  • 如果要跳过几行的执行,请将黄色标记拖动到要执行的下一行。请记住,将标记拖到某个位置可能会导致执行顺序,而在运行时,如果不进行干预,则执行顺序永远不会发生,因此结果可能是完全错误的

  • 好的,经过一点挖掘,你可以做到这一点-但它不会在所有情况下都起作用

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

    首先需要将此宏添加到宏环境中(在VS中使用ALT+F11打开)。这段代码可能没有我刚才急匆匆写出来的那么好:)

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

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

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

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

    我不知道应该返回的方法将如何运行——理论上,它们应该返回本地的任何返回值,但在某些情况下,事实是这根本不起作用


    同样,如果断点位于try/catch块中,那么它将不起作用-因为必须先退出try/catch,然后才能将下一条语句设置为其外部的某个位置。

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

  • 在函数的底部找到return语句的地址,方法是先断开它一次,然后在Registers窗口中查看EIP寄存器,或者为“@EIP”添加一个手表
  • 将跟踪点添加到要从中跳转的线。请记住,跳转将在执行行上的任何内容之前发生。跟踪点的内容应该是
    {@eip=address}
    ,使用步骤1中的地址
  • 利润
    另请参见

    +1,或右键单击函数中的返回语句或大括号,然后选择“设置下一个语句”。尽管值得指出的是,它只在将代码指向当前堆栈中的其他地方时才起作用;我认为try/catch块不能生效。我希望它自动生效。我不想每次在断点命中时拖动执行点。然后考虑<代码> Goto < /C>命令:如下:<代码>如果(You-BurnPositTx条件)Goto EndoMaX;但是我需要在我的代码中添加一个标签,对吗?还是存在我可以随时转到的伪标签?(请注意,我不能更改代码。)如果你连一点代码都不能更改,那你就别无选择。非常酷。我仍然希望有人有一个非宏、返回值的答案,但这是迄今为止最好的答案。@Protectorone没有答案-除非您自己编写调试器。如果一个方法返回一个局部变量,你可以使用watch(甚至使用另一个宏)来设置局部变量,然后再使用这个变量来返回。假设函数有一个return语句…@Protectorone实际上你甚至不需要return语句。你应该能够在最后一个结束大括号上断开并使用该地址。
    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