1.windbg.exe
windbg.exe是windows平台的debug工具, 但是c#的程式需要sos.dll和so***.dll來支援。
其中sos.dll,該擴充套件包是.net平台的一部分,是於官方版本.
2.mscordacwks.dll
mscordacwks.dll是.net data access (.net資料訪問層), sos.dll/so***.dll是通過它來訪問.net clr的.
3.配置
a.安裝完windbg後,在framework的目錄下,拷貝sos.dll到windbg的安裝目錄。一般sos.dll在c:\windows\microsoft.net\framework\v4.0.30319目錄下.
4.除錯軟體
a.執行目標程式
b.獲得目標程式的程序id
c.開啟windbg, 在file選單下,symbol file path中加入這兩項:
a)srv*c:/symbolcache*
b)目標程式目錄,這個目的是讓windbg載入其需要的pdb檔案
d.在windbg的file選單下,attach to a process, 選擇我們目標程式的程序id
e.sos.dll擴充套件加進來.在出現視窗的最下面的命令輸入行,輸入: .load sos.dll
f.so***.dll擴充套件加進來.在出現視窗的最下面的命令輸入行,輸入: .load so***.dll
5.檢視最耗記憶體的所在
.cls -------------------------------清屏
~ ----------------------------------檢視當前程式的所有執行緒
~0s --------------------------------切換到我們需要除錯的原託管執行緒中
!threads ---------------------------命令可以檢視程序內所有的託管執行緒,僅僅是託管執行緒
!dumpheap -stat --------------------統計堆的資訊
!dumpheap -type system.string ------檢視string型別在堆中的資訊.為什是string,是因為在!dumpheap -stat的結果中,發現string占用最記憶體最多
!gcroot 02029348 -------------------檢視記憶體很高的堆位址, 02029348 是!dumpheap結果中有對string操作的堆最大的adress
!help gcroot -----------------------檢視gcroot的幫助
gcroot會顯示system.string 耗用過多的整個呼叫過程.
handletable:
001613e8 (pinned handle)
-> 02fc5328 system.object
-> 02028ab8 mysql.data.common.cache`2[[system.string, mscorlib],[mysql.data.mysqlclient.mysqlconnectionstringbuilder, mysql.data]]
-> 02028acc system.collections.generic.dictionary`2[[system.string, mscorlib],[mysql.data.mysqlclient.mysqlconnectionstringbuilder, mysql.data]]
-> 020407e0 system.collections.generic.dictionary`2+entry[[system.string, mscorlib],[mysql.data.mysqlclient.mysqlconnectionstringbuilder, mysql.data]]
-> 02028bf4 mysql.data.mysqlclient.mysqlconnectionstringbuilder
-> 02028c18 system.collections.generic.dictionary`2[[system.string, mscorlib],[system.object, mscorlib]]
-> 02029348 system.collections.generic.dictionary`2+entry[[system.string, mscorlib],[system.object, mscorlib]]
根據這個提示,我們找到原始碼中mysql.data.common.cache類中的呼叫**,然後根據實際情況進行改進
初次使用Windbg檢查C 程式記憶體
新建乙個c 控制台程式,使用如下 編譯 class program public class testclass view code 初次使用,需要載入符號檔案。選擇選單 file symbol file path,輸入 選擇 file attach to a process,然後在彈出的視窗中選擇...
C 記憶體洩漏原因分析
一.記憶體洩漏 1.什麼是記憶體洩漏 記憶體洩漏是指在程式中申請了記憶體沒有呼叫釋放函式,導致記憶體沒有被系統 程式記憶體會不斷增大,最後導致系統記憶體不足,程式卡頓或崩潰。2.記憶體洩漏的原因 1 呼叫new或者malloc申請記憶體後沒有主動呼叫delete或者free。2 在使用多型特性時,基...
C 中引數化查詢速度慢的原因
今天同事問了乙個很有意思的問題,為啥我執行的sql在資料庫裡面執行的很快,在程式中執行的速度怎麼能這麼慢?真實案例 只是查詢語句不是這麼簡單 同事 你看我執行的語句在sqlserver中執行的有多快 語句 select a.id,b.id,a.其他列 from a left join b on a....