你知道怎么使用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 clocktimeEdit -> 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 构