windbg查詢c 高記憶體原因

2021-07-05 20:42:08 字數 2254 閱讀 2313

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....