windbg除錯 控制代碼洩露

2021-06-20 15:18:46 字數 1530 閱讀 6365

1、用c++寫乙個控制代碼洩露的樣例程式:

#include "stdafx.h"

#include

void fun1(void);

void fun2(void);

void fun3(void);

void fun4(void);

int main(int argc, char* argv)

return 0;

}void fun1(void)

void fun2(void)

void fun3(void)

void fun4(void)

**非常簡單,明眼人一看就能看出**有問題,那麼程式編譯後用windbg怎麼調出來呢?

2、windbg除錯

1)找到windbgs安裝目錄下的gflags.exe工具,該工具可用來開啟windows自帶的一些除錯選項,具體gflags.exe的詳細使用可以檢視windbg幫助;

2)執行windbg,開啟第一步編譯的程式,並使其跑起來;此時你檢視任務管理器中的控制代碼資訊,會發行相應程序控制代碼一直在增加。

3)windbg用ctrl+break命令中斷程序執行,用!htrace -enable命令開啟控制代碼檢測;htrace提供了進行控制代碼相關檢測的命令,可檢視windbg幫助。

同時用g命令讓程式執行。

4)再次中斷程序,使用!htrace -snapshot命令,獲得此時程序控制代碼的映象。並再次讓程式執行。

5)第三次中斷程序執行,我們再使用!htrace -diff命令獲得當前控制代碼狀態與第4步 snapshot映象控制代碼的差異;

我們可以發現:新增很多開啟的控制代碼,平常情況下這些開啟的控制代碼有可能不是洩露,需要具體分析,但是本次示例程式太簡單,所以剛好所有開啟的控制代碼都屬於洩露的。

6)我們使用lsa 傳遞指定位置對應的**,lsa   handlew2!fun4+0x0000002e

到這裡,我們就找到了洩露控制代碼的函式,真是神奇啊。

控制代碼洩露除錯

控制代碼洩露除錯 控制代碼洩露除錯 handles leak debug 一 概述 造成控制代碼洩露的主要原因,是程序在呼叫系統檔案之後,沒有釋放已經開啟的檔案控制代碼。對於控制代碼洩露,輕則影響某個功能模組正常執行,重則導致整個應用程式崩潰。在 windows系統中,gdi 控制代碼上限是 120...

windbg除錯 記憶體洩露 不斷上公升

在大型專案中,記憶體洩露並不會立即 crash 會使系統效能不斷下降,甚至因記憶體耗盡而崩潰。排查起來難度也比較大,申請記憶體的地方很多。這裡介紹的這種方法可以迅速定位問題。下面的程式crash64,每秒會申請1m的記憶體,而一直都沒有釋放,產生記憶體洩露 windbg 中有個小工具 umdh可以追...

控制代碼洩露問題追蹤

無論是在編寫windows程式還是linux程式,都可能存在控制代碼洩露的問題。在linux中一般來說乙個程序的fd使用是有上限的,可以使用ulimit命令進行上限檢視,當出現fd洩露的時候,可能會出現socket建立失敗,檔案打不開等問題。windows類似,本文主要闡述了對windows中的控制...