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中,您可以将指示调试时的当前代码行的箭头拖动到函数末尾。两个选项:
好的,经过一点挖掘,你可以做到这一点-但它不会在所有情况下都起作用 注意,这使用宏,不能保证与内联委托一起工作;或者使用实际需要返回某些内容的方法。当遇到断点时,它会自动执行@juergen d和@Erno描述的过程;使用非常简单的启发式方法查找当前函数的结束位置 首先需要将此宏添加到宏环境中(在VS中使用ALT+F11打开)。这段代码可能没有我刚才急匆匆写出来的那么好:) 有了它,现在你可以设置断点了——右键点击它,点击
When hit…
菜单选项(我相信这只适用于VS2010)。ScottGu在博客中描述了这一点
从对话框中,找到刚刚粘贴的ExitStack
宏
在附加调试程序的情况下运行代码,当遇到断点时,应跳过函数的其余代码。这应该遵守其他调试器技巧,如条件等
注-我曾经解决过我遇到的一个问题;最初我直接调用调试器的SetNextStatement方法,但它不起作用
我不知道应该返回的方法将如何运行——理论上,它们应该返回本地的任何返回值,但在某些情况下,事实是这根本不起作用
同样,如果断点位于try/catch块中,那么它将不起作用-因为必须先退出try/catch,然后才能将下一条语句设置为其外部的某个位置。是的,可以直接使用跟踪点来执行此操作
{@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