2012-01-19 25 views
6

是否可以使用斷點/跟蹤點從函數自動返回?
我不想拖動執行點,或者每次命中斷點時都用CTRL + SHIFT + F10進行設置。
我試着「打印」下面的「消息」當擊中時,但執行繼續而沒有改變。使用斷點返回函數

{return;} 
{return null;} 

請注意,我需要從函數返回而不實際更改代碼。

明確Tracepoint是什麼:「跟蹤點是一個帶有與其相關聯的自定義操作的斷點,當命中跟蹤點時,調試器執行指定的跟蹤點操作,而不是除了破壞程序執行「。MSDN

如果您不知道「打印消息」的含義,那麼您可能需要閱讀關於跟蹤點的this AltDevBlogADay post。這很好。

回答

3

好吧,有點你周圍挖後可以做到這一點 - 但它不會在所有情況下工作。

請注意,它使用宏並且不能保證與內聯代理一起使用;或者實際需要返回某些東西的方法。它自動執行@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在this博客文章中對此進行了描述。

從對話框中找到ExitStack宏,你剛剛粘貼進來。

運行與調試器的代碼連接,當斷點命中函數的代碼的其餘部分應被跳過。這應該服從其他調試器技巧 - 如條件等。

注 - 我使用this SO來解決我遇到的問題;最初我直接調用調試器的SetNextStatement方法,它不起作用

我不知道應該返回的方法將如何表現 - 理論上它們應該返回當前返回值的任何值,但在某些情況下事實是,這根本行不通!

同樣,如果斷點位於try/catch塊中,那麼它將不起作用 - 因爲try/catch必須先退出,然後才能將下一個語句設置到它之外的某個位置。

+0

很酷。我仍然希望有人有一個非宏觀,價值回報的答案,但這是目前爲止最好的答案。 –

+0

@Protectorone沒有一個 - 除非你編寫你自己的調試器。如果一個方法返回一個局部變量,你可以使用watch(甚至使用另一個宏)來設置局部變量,然後使用這個變量返回。 –

7

在Visual Studio中,您可以將指示調試過程中當前代碼行的箭頭拖至該函數的末尾。

+4

+1見,或右鍵單擊功能return語句,或者花括號,然後選擇「設置下一條語句」。 雖然值得指出的是,它只適用於在當前棧中指向其他地方的代碼;我認爲try/catch塊不能生效。 –

+0

我想要它自動。每次斷點時,我都不想拖動執行點。 –

+0

然後考慮'goto'命令:'if(your_breakpoint_condition)goto end_marker;' –

3

兩個選項:

  1. 如果你想要的功能來完成它的執行並返回給調用者後打破。按下「Step Out」(Shift-F11)
  2. 如果您想要跳過多行的執行,請將黃色標記拖到您要執行的下一行。請記住,將標記拖動到某個位置可能會導致執行順序在運行時不會發生,因爲結果可能完全錯誤。
1

是的,你可以直接使用tracepoint來做到這一點。

  1. 在函數的底部找到返回語句的地址,方法是打開一次,然後在寄存器窗口中查看EIP寄存器,或者添加Watch的「@eip」。
  2. 將追蹤點添加到要跳轉的線上。請記住,跳轉將發生在執行任何行之前。跟蹤點的內容應該是{@eip = address},使用步驟1中的地址。
  3. 利潤!

https://stackoverflow.com/a/14695736/301729

+0

假設函數_has_返回語句... –

+0

@Protectorone其實你甚至不需要返回語句。你應該能夠打破最後的大括號並使用該地址。 –