你知道怎么使用DebugView查看调试信息吗?
簡介
DebugView是sysinternals工具集中的一款用來查看調試信息的工具。不管你是內核開發人員還是應用程序開發人員,都會用到這款神器。先簡單看看DebugView可以干什么吧。
- 可以查看應用程序輸出的調試信息。 
- 可以查看驅動程序輸出的調試信息。 
- 可以查看本地機器的調試信息。 
- 可以查看遠程機器的調試信息。 
- 可以根據規則高亮顯示。 
- 可以根據關鍵字過濾。 
- 可以根據關鍵字搜索。 
- 可以自動顯示最新一條記錄。 
- …… 
功能太多太全了,有木有?心動了嗎?快跟我一起來了解下這個神器吧。
如何輸出調試信息
應用程序和驅動程序都可以通過對應的API生成調試信息。
- 非托管應用程序可以通過Win32 API OutputDebugString()輸出調試信息。 
- 托管應用程序可以通過System.Diagnostics.Debug.Print()輸出調試信息,內部會調用OutputDebugString()。 
- 驅動程序可以通過DbgPrint()或DbgPrintEx()(或者使用KdPrint或KdPrintEx宏)輸出調試信息。這兩個宏在Debug版里會分別映射到DbgPrint()或DbgPrintEx(),在Release版會映射為空。 
下圖是一個使用DebugView捕獲C++程序和C#程序輸出的調試信息的截屏。
示例基本功能
DebugView有一些值得我們了解的功能,下面列舉了一些我用到的功能。
- Options -> Show milliseconds 可以精確到毫秒,默認精確到秒。 
- Options -> Clock time (快捷鍵 CTRL + T),可以切換時間顯示方式。 - 有時候我們希望知道兩條調試信息的時間差(估算某段代碼的執行效率的時候),有時候我們希望知道某條調試信息具體的時間點,可以按CTRL + T快速切換。 switch clocktime
- Edit -> Filter/Highlight...可以過濾/高亮符合條件的記錄。 
- 不相關的調試信息太多,看不過來怎么辦?過濾功能可以幫助我們排除無用的調試信息。 
- 所有記錄都是黑白的,區分起來太費勁,關鍵調試信息不夠醒目。怎么辦?高亮功能可以高亮顯示包含特定關鍵字的調試信息。 
 
點開下面的視頻感受下吧!
過濾/高亮功能
- 使用File -> New Window...可以快速啟動DebugView的新實例。如果你需要監聽多臺機器的調試信息,此功能可能對你有用。 
- 使用Computer -> Connect...可以監視遠程計算機的調試信息。 監視遠程機器的調試日志
使用此功能,需要注意以下事項:
- 遠端機器上必須以代理模式運行DebugView??梢酝ㄟ^dbgview.exe /a啟動代理模式。更多選項,請參考DebugView的幫助文檔,或者運行dbgView.exe -h查看。 
- 以代理模式運行的DebugView會監聽TCP 2020端口,注意設置防火墻的例外規則。 
- DebugView可以同時連接并監視多臺遠程計算機。可以通過Computer->Disconnect來斷開與某臺計算機的連接。 
- 當前連接的機器名會在標題欄顯示,注意看標題欄。 
 
- 不要讓多個DebugView同時監聽同一臺機器的調試信息,否則會導致調試信息分別發送到不同的DebugView中,對我們排錯產生不必要的干擾! 
- dbgView.exe -h可以查看DebugView支持的命令行參數及簡短介紹。 命令行選項
- 其它 
- F1打開幫助文檔。 
- CTRL + F查找符合條件的調試信息。 
- F3查看下一條查找到的記錄。 
- CTRL + C復制選中的記錄。 
- CTRL + S保存調試信息到文件中。 
- CTRL + X清空所有的調試信息。 
- CTRL + A開啟或關閉自動滾屏。 
- …… 
 
- 更多功能,請參考《Windows Sysinternals 實戰指南》。 
如果遇到DebugView不能捕獲調試信息的情況,可以從以下幾個方面排查:
問題及解決方法
- 如果應用程序正在被調試,那么DebugView捕獲不到該程序的調試信息,請到調試器的輸出窗口查看。具體原理可以參考張銀奎老師的《軟件調試》。 DebugView捕獲不到"C# Debug Message!"
- 是否勾選了對應的捕獲選項。有時候最簡單的反而是最容易被我們忽略的。 捕獲選項
- 檢查當前的DebugView實例的連接狀態,注意看標題欄。 通過標題欄查看連接狀態
- 在win10系統中,無法捕獲驅動程序輸出的調試信息。 - 首先,捕獲驅動程序的調試信息,需要管理員權限,如果沒有管理員權限,會報下圖中的錯誤: 需要管理員權限
其次,從Vista開始,需要設置注冊表才能捕獲。另存下面代碼為Debug Print Filter.reg,雙擊導入注冊表后,重啟生效。
Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter] "DEFAULT"=dword:0000000f注冊表對應的內容如下圖所示:
具體原因請參考 http://www.osronline.com/article.cfm%5eid=295.htm,為了方便大家,我截取了該網址的內容:
- 退出DebugView后,再次運行DebugView捕獲內核調試信息會報下圖中的錯誤: unable to access dbgv.sys- 從提示看,應該是Dbgv.sys被占用了。使用Process monitor查看DebugView的文件讀寫記錄,印證了我們的猜測。 dbgview-createfile-failed-event
本想通過process explorer的Find Handle or DLL功能來查看是哪個進程在占用,未果!使用其它工具也沒搜到相關信息。如果有哪位朋友知道如何查看驅動文件(*.sys)的占用情況,請告訴我!
no-search-result-of-dbgv在網上搜到解決方案:只需要重命名Dbgv.sys即可。參考網址:https://www.cnblogs.com/jiaochen/p/5581440.html
說明: 這應該是老版本的一個bug,我在微軟官網上下載最新的4.9版本的DebugView后,沒有此問題了。建議大家下載最新版的DebugView使用。
廣而告之
關于OutputDebugString()的實現原理,可以參考 張銀奎老師的 《軟件調試》(第一版)第10章 10.7節 輸出調試字符串?!盾浖{試》這本調試領域的扛鼎之作不用我多做介紹吧?買就對了!不過第一版已經絕版了,好消息是:《軟件調試》(第二版)卷 1:硬件基礎 已經出版了。而且聽張老師說,年底的時候, 《軟件調試》(第二版)卷 2 有望出版(不過看這意思,2019年應該沒戲了,希望2020年上半年能等到),對調試感興趣的朋友有福了,多多關注下吧。
對了,張老師也有公眾號的,大家可以搜索格友關注。
總結
- 使用OutputDebugString()可以方便的輸出調試信息。如果你還沒在你的程序里加上調試信息的話,快快加上吧。注意不要把敏感信息輸出來,別人用工具可以方便的查看到。切記! 
- DebugView是調試的好幫手。過濾和高亮功能可以讓我們更加有效的查看我們關心的調試信息。 
- 《軟件調試》詳細講述了OutputDebugString()的實現原理,感興趣的小伙伴兒一定要看啊! 
參考資料
- 《Windows Sysinternals 實戰指南》 
- 《軟件調試》 
- OSR: Getting DbgPrint Output To Appear In Vista and Later[1] 
- dbgview 在 windows 10 中關閉后再次打開時無法 "capture kernel"[2] 
References:
[1] OSR: Getting DbgPrint Output To Appear In Vista and Later:?
http://www.osronline.com/article.cfm%5eid=295.htm
[2] dbgview 在 windows 10 中關閉后再次打開時無法 "capture kernel":?
https://www.cnblogs.com/jiaochen/p/5581440.html
歡迎留言交流
總結
以上是生活随笔為你收集整理的你知道怎么使用DebugView查看调试信息吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 开源.Net Standard版华为物联
- 下一篇: 使用ASP.NET Core 3.x 构
