Được rồi, sau một chút đào xung quanh bạn có thể làm điều này - nhưng nó sẽ không hoạt động trong mọi trường hợp.
Cẩn thận, điều này sử dụng macro và không thể được đảm bảo để làm việc với đại biểu nội tuyến; hoặc với các phương thức thực sự cần trả lại một cái gì đó. Nó tự động hóa quá trình được mô tả bởi @juergen d và @Erno khi một điểm ngắt được nhấn; bằng cách sử dụng heuristics rất đơn giản để tìm nơi kết thúc của hàm hiện tại.
Trước tiên, bạn cần phải thêm macro này vào môi trường macro của mình (mở bằng ALT + F11 trong VS). Mã này có lẽ là không tốt như nó có thể là như tôi vừa vội vã nó ra :)
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
Với điều đó tại chỗ, bây giờ bạn có thể đặt breakpoint của bạn - click chuột phải vào nó và nhấn tùy chọn trình đơn When hit...
(điều này chỉ hoạt động trong VS2010 tôi tin). ScottGu mô tả điều này trong this bài đăng trên blog.
Từ hộp thoại, tìm ExitStack
macro mà bạn vừa dán vào.
Run mã với trình gỡ lỗi kèm theo và khi breakpoint là hit phần còn lại của mã của chức năng nên được bỏ qua. Điều này nên tuân thủ các thủ thuật trình gỡ rối khác - như điều kiện, v.v.
Lưu ý - Tôi đã sử dụng this SO để giải quyết vấn đề tôi đang gặp phải; ban đầu tôi đã gọi phương thức SetNextStatement của trình gỡ rối trực tiếp và nó không hoạt động
Tôi không biết các phương thức sẽ trả về sẽ hoạt động như thế nào - theo lý thuyết chúng phải trả lại bất kỳ giá trị trả về nào tại thời điểm đó, nhưng trong một số trường hợp thực tế là điều này chỉ đơn giản là sẽ không hoạt động!
Tương tự nếu điểm ngắt nằm trong khối try/catch thì nó sẽ không hoạt động - vì try/catch phải được thoát ra trước khi bạn có thể đặt câu lệnh tiếp theo ở đâu đó bên ngoài nó.
Khá tuyệt. Tôi vẫn hy vọng một người nào đó có câu trả lời không vĩ mô, có giá trị, nhưng đây là câu trả lời hay nhất cho đến nay. –
@Protectorone không có một - trừ khi bạn viết trình gỡ rối của riêng bạn. Nếu phương thức trả về biến cục bộ, bạn có thể sử dụng đồng hồ (hoặc thậm chí sử dụng macro khác) để đặt địa phương trước khi sử dụng biến này để trả về. –