2013-02-07 153 views
16

我有一個更大的(c#)WPF應用程序,其中n-classesm-methods。我想在每一個方法中放置一個斷點,所以每次按下應用程序中的按鈕或者調用任何方法時,我都希望VS2010中的應用程序能夠觸發該斷點。我想了解應用程序的流程/進度。如何在VS2010中的每種方法中設置斷點

而且,由於我有很多方法,我寧願不手動放置每個和每個他們的斷點。

是否有任何命令或工具可以將我的VS2010解決方案中的任何位置放置一個斷點?

編輯:可能像下面的插件:http://weblogs.asp.net/uruit/archive/2011/08/04/visual-studio-2010-addin-setting-a-class-breakpoint.aspx

EDIT2:有一些答案,但他們都不似乎是直接的簡單的解決方案。還要別的嗎?

+0

[有沒有Visual Studio宏來設置類中每個方法的開始處的斷點?](http://stackoverflow.com/questions/4396613/is-there-a-visual-studio -macro-set-a-breakpoint-on-the-start-of-every-method) – Sjoerd

+2

這是一個瘋狂的想法,但非常有用! –

+2

你可以在一個步驟中設置許多斷點,看看:http://www.codeproject.com/Articles/139120/Tips-Set-Breakpoint-to-multiple-Functions-at-the-s但是,它沒有設置_every_方法的斷點。請注意,這可能會[緩慢調試](http://stackoverflow.com/questions/589338/slow-debugging-issue-in-visual-studio)巨大。 –

回答

-1

您可以使用System.Diagnostics.Debugger.Break()輸入您的方法。

類似這樣的事情可能與你在範圍內設置的bool有關?

#if DEBUG 
    if (BreakPointEveryMethod) 
    System.Diagnostics.Debugger.Break(); 
#endif 

會有在notepad++一個快捷方式也添加這個是肯定的,但我不知道有一個快速簡便的方法可以讓你通過簡單的命令行實現這一目標。

0

我想你創建使用的工具,像它的「縱橫」:postsharp

面向方面的編程可以讓你將代碼添加到每個方法的開始或結束(通過後處理步驟)。所以這是微不足道的添加線:

System.Diagnostics.Debugger.Break() 

每個方法(沒有實際編輯所有的源代碼)。 更典型的是,它用於在每個方法的開始處添加日誌語句,例如:「輸入方法DrawLine(x = 30,y = 80,z = 12)」,並在方法結尾處:「離開方法DrawLine(x ,Y,Z)」。這使得你的程序流程變得容易:

+0

有趣。我會仔細看看的。 – Gero

4

This answer暗示一個宏會按照你的要求去做,但我個人的建議是使用一個profiler--一個讓你暫停和恢復動態分析的宏(幾乎所有的的商業剖析器),然後在點擊按鈕之前點擊「開始剖析」按鈕。在剖析器中查看調用樹通常是深入瞭解應用程序正在做什麼的一種非常方便的方式,而不僅僅是在調試器中逐步完成。

更新:此功能存在於我正在處理的Visual Studio擴展中,名爲OzCode。隨着OzCode,當你點擊圖標旁邊的類定義,你會看到QuickAction:

Add Breakpoint to every member in class

+0

是否有任何可以建議的分析器? – Salim

+0

@Salim有許多不同的例子,JetBrains dotTrace和紅門螞蟻就是其中的幾個例子。請注意,我所描述的技術只能在檢測模式(記錄每個單一方法條目)下工作,而不能在Profiler的採樣模式下工作,如果這些方法僅在很短的時間內執行,則可能不包括某些方法。 –

5

編輯:只與測試C++

我碰到this article來顯示如何在類的每個方法的開始處設置斷點。我已經用VS 2010測試過了。的基本過程(使用Visual C++時)是:

  1. 轉到調試>新斷點>斷點在功能(按Ctrl + B)。
  2. 功能場,插入MyClass::*
  3. 這將顯示爲在斷點窗口一個斷點,但只要爲MyClass的方法之一被擊中,你會看到在一個斷點MyClass中的每個函數的開頭,並且所有這些都將是斷點窗口中原始斷點的「子」。

我想這也適用於C#。

+0

感謝您的鏈接,但我無法重現與我的C#類相同的效果。無斷點。你能用2種方法做一個小班,並檢查它是否可以與c#一起工作? – Gero

+4

經過一番搜索,我發現[這個答案](http://stackoverflow.com/a/15028569/504611)。其中的一個評論說這個方法只適用於C++。道歉誤導的答案。 –

0

這裏有一個快速和骯髒的方式使用簡單的文本替換做到這一點:

  1. 格式化C#文件,使所有凹槽的一字排開。您可以在Edit>Advanced>Format Document
  2. 打開做到這一點的文字與Ctrl+H
  3. 設置「文本查找」字段此"^ {"更換。
  4. 將「替換」字段此" {System.Diagnostics.Debugger.Break();"
  5. 點擊小「使用正則表達式」按鈕,在窗口
  6. 點擊「全部替換」或打Alt+A
  7. 如果你的文件有嵌套枚舉任何類,類或結構,你會有一些編譯錯誤。直到代碼編譯完成,從它們中移除調試調用。如果你的嵌套類有自己的方法,那麼你必須在替換字符串中使用更多的選項卡再次運行這個過程。

工作原理:這使用Visual Studio文檔格式化程序,並假定文件中的所有方法都以兩個選項卡開始,然後是「{」。因此,任何以兩個標籤和一個「{」開始的行將被替換爲相同的兩個標籤,相同的「{」和調試器的調用。

如果你的文件嵌套枚舉等,你會得到編譯器錯誤,因爲文本替換不區分方法和枚舉。例如,你會看到這一點:

enum MyColors 
{ System.Diagnostics.Debugger.Break(); //error here 
    Red, 
    Green, 
    Blue, 
} 

如果要禁用這些斷點的能力,我能想到的最好的辦法就是一個簡單的布爾。某處在你的代碼,插入此:

#if DEBUG 
     private static bool _ignoreDebug = false; 
#endif 

(我把#if DEBUG在那裏作爲一個標誌,這個代碼僅用於調試這是沒有必要的。)然後,在步驟#4以上,使用替換字符串,而不是:

"  {if(!_ignoreDebug){System.Diagnostics.Debugger.Break();}" 

然後,當你打一個斷點,不希望打更多的,在監視窗口中鍵入這並回車_ignoreDebug = true。要重新啓用它,您需要在可訪問_ignoreDebug bool的某處插入手動斷點。


從代碼中刪除了這一切,無論是做另外的文本替換,或只是編輯撤消一切。