2011-11-14 29 views
21

我正在考慮將診斷模式構建添加到應用程序中,我正在寫這些程序來計算方法使用情況和執行時間,類似於像dotTrace這樣的許多代碼分析器。.NET分析器如何工作?

我在通過谷歌查找資源時遇到了一些麻煩,但是如何完成此操作;顯然這是可能的,但任何人都可以指向我如何在.NET中實現諸如方法調用計數之類的資源嗎?

+8

http://www.codeproject.com/KB/dotnet/dotnetprofiler.aspx – Oded

+0

實現,你將不得不相當低的水平,甚至使用C++(本機),因爲你將需要掛鉤的.NET運行時本身(例如,請參閱Oded的鏈接)...另一種選擇是使用某種產品(例如SmartAssembly可以配置爲構建應用程序中的使用情況報告)... – Yahia

+0

我相信他們基本上將代碼分解爲IL,然後在每條指令之後注入各種標記。絕對不是微不足道的寫入,但我想這就是爲什麼ANTS的東西太昂貴了。 –

回答

7

代碼項目文章Creating a Custom .NET Profiler描述了使用CLR探查器鉤子創建探查器的過程。

這包括創建實現ICorProfilerCallback2接口的COM對象,然後使用環境變量來指示,我們希望通過這個類來剖析CLR:當CLR開始一個過程

,它看起來對於兩個環境變量:

  • COR_ENABLE_PROFILING:此環境變量設置爲1或0. 1表示CLR應使用分析器。 0(或不存在此環境變量)表示它不應該使用分析器。
  • COR_PROFILER:既然我們已經告訴CLR我們想要分析,我們必須告訴它要使用哪個分析器。由於分析器是作爲COM對象實現的,因此此環境變量將設置爲實現ICorProfilerCallback2接口的coclass的GUID。
+0

是否可以同時設置2個分析器?如何設置COR_PROFILER env變量以便同時使用兩個分析器DLL – Kira

+0

我對此表示懷疑。特別是當描述談到單個分析器時。我想你可以創建一個其他Profiler可以訂閱的Profiler代理,但這只是一個想法。 – Oded

1

也許我在這裏太簡單了,但我的解決方案就是記錄。使用entlib或log4net並記錄調試級別消息。然後你可以寫一個腳本/程序來分析日誌文件並給你方法數。甚至可能還有其他日誌診斷工具。

除非你需要豐富的可視化或實時複雜的關係映射等。你需要一個分析器?對於方法計數和執行時間,日誌文件是否足夠?一旦你在生產或不關心儀器儀表,你就可以把你的日誌級別提升起來,忘掉那些調試信息。

+1

日誌記錄的問題是不得不通過日誌記錄調用亂丟我的代碼。特別是如果我想要執行某些操作時,我需要至少爲每個方法添加3行以上的內容(定時器設置/啓動,計時器停止,日誌消息調用)。這很麻煩。 – Amasuriel

+0

同意。那就是爲什麼我會建議像Spring.Net或PostSharp這樣的AOP框架。 AOP本身非常棒,不僅僅是爲了伐木。誠然,我不會在一個項目中添加一個全新的組件,只是爲了測試一種方法或在一個地方保存3行代碼,但是如果您經常使用它,那麼就需要AOP。 AOP的投資回報率相當高,應該引入的臨界點很低,換句話說,任何一個項目都是非常複雜/專業的。事實上,如果你正在考慮採伐,你也應該考慮AOP。我的2美分:-) – Chaitanya

+0

我不知道PostSharp,感謝您的鏈接。我打算使用Enterprise Library 5進行日誌記錄,但是我已經對使我的代碼混亂的方法調用數量感到驚訝。 – Amasuriel