1. 程式人生 > >Windbg的gflags.exe除錯堆疊溢位,訪問越界等問題。

Windbg的gflags.exe除錯堆疊溢位,訪問越界等問題。

  gflags.exe是Windbg下的一個小工具,非常好用,對於除錯程式隱藏的bug很有幫助。

  如:我在vs2015中遇到訪問越界的問題,但程式不會在越界的地方發生崩潰中斷,而是在一個不可能存在訪問錯誤的地方發生了錯誤,以至於無法定位問題的位置。
 
  所以在網上看到了Windbg的方法,一開始對Windbg不是很瞭解,熟悉之後發現Windbg很強大,雖然只用到了其中的一個小工具gflags.exe。

舉個栗子:

    int main()   
    {    
        char *p = new char[10];  
        for(int i = 0; i != 11; ++i)     
            p[i] = i;    
        return 0;    
    }

  這是一個非常簡單的越界程式,當i = 10時,訪問越界了。但是如果不採用測試工具,這裡是不會發生崩潰的。一般情況下,程式獲取的空間是16位元組對齊的,所以p[10]訪問到的是對齊之後增加的空間,不會導致越界崩潰。但這是隱患,為了使隱患儘早被發現,使用工具是很好的選擇。
  gflags用來跟蹤這個程式的執行,可以設定每一次new分配的堆空間都單獨的佔有一塊空間,並且這個空間相鄰的位置被設定為不可訪問的,一旦訪問越界立即觸發訪問無效錯誤,儘早的觸發崩潰。

gflags.exe的作用:跟蹤被除錯的程式

方法:
1、下載Debugging Tools for Windows,使用其中的gflags.exe。
2、雙擊開啟gflags.exe,選擇Image File標籤。前兩個標籤是對所有程式進行跟蹤。
3、在Image欄裡輸入你希望除錯的程式名。比如,mytest.exe。(按Tab重新整理)。
4、勾選Debugger並輸入vsjitdebugger.exe。
5、點選OK或者Apply。

注:用vc編譯出release版本的可執行檔案:mytest.exe。(注意:不是debug版本),gflags.exe工具跟蹤被監控的程式一定要是release版本的,debug版本的跟蹤的不會那麼的準確。

這裡寫圖片描述

這個時候,已經把要監控的test.exe註冊上了。程式會中斷到發生錯誤的地方,有原始碼更好檢視,本人就是在原始碼下進行除錯。

最後、問題解決了記得關閉gflags,因為開啟gflags,除錯執行就慢了,最後會影響到程式的效能,親測效能下降非常嚴重。
關閉方法;

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/Image File Execution Options/mytest.exe

網上看到是取消Debugger的勾選,但是無效,最後清除登錄檔後程序恢復原有速度。

本人已上傳Debugging Tools for Windows,如有需要可在資源中下載,連結如下

相關推薦

Windbg的gflags.exe除錯堆疊溢位訪問越界問題

  gflags.exe是Windbg下的一個小工具,非常好用,對於除錯程式隱藏的bug很有幫助。   如:我在vs2015中遇到訪問越界的問題,但程式不會在越界的地方發生崩潰中斷,而是在一個不可能存在訪問錯誤的地方發生了錯誤,以至於無法定位問題的位置。

阿裏雲服務器win10 訪問服務器圖片資源提示 401 - 未授權: 由於憑據無效訪問被拒絕

應用程序池 技術分享 mage 訪問服務器 win10 程序池 身份驗證 標識 憑據 網站遷移後,訪問圖片資源提示401 打開IIS管理器 選擇網站 右側打開“身份驗證” 啟用匿名身份驗證 編輯匿名身份驗證憑據,選擇 應用程序池標識 保存 阿裏雲服務器w

springmvc和springboot分別設定攔截器列印記憶體資訊訪問時間日誌資訊

SpringMVC提供了一個攔截器介面供我們呼叫:HandlerInterceptor,這個介面有三個待實現的方法: preHandle方法 進入 Handler方法之前執行 用於身份認證、身份授權 比如身份認證,如果認證不通

安卓開發 RecycleView 中notifyItemRemoved遇到的那些坑 IndexOutOfIndexException、刪除錯亂陣列越界終極解決方案多人親測可行

當我們在開發過程中要刪除RecycleView中的某個item時,都喜歡notifyItemRemoved方法帶來的動畫效果,然而,會遇到錯亂的坑,主要有三個,如下: 再刪除後面的item,會發生錯

sql中的連接表達式視圖

out ans cte 指定 varchar toc 出現 .... 卡爾 給定兩張表 表A create table A(ID int,name varchar(20),description varchar(20)); insert into A values(

左滑操作(刪除置頂)

在滑動列表中,常常會有左滑出現刪除,置頂操作的需求,如下qq的左滑效果: 今天也來實現下類似的效果,可供大家參考: 1.實現原理 原理圖 2.實現自定義左滑View 1.新增View 首先在自定義V

WifiDirect (WIFIP2P) 最全最詳細,應用於智慧硬體(智慧家居車機無人機)

前沿:好久沒更部落格了,手都快生了。不過但凡長時間的積累之後就會有精品,我希望我這一篇文章能幫助各位正在“坑裡”的猿猿們。 產品:你給我調研一個手機連上無網WIFI 後能繼續使用手機流量的 需求。WIFI不能自動跳轉和改變,(WIFI和移動流量必須同時開啟)。 程式設計師:????

JavaScript 在vue頁面下實現滑鼠拖拽div改變其大小適用於鷹眼地圖街景地圖

首先看效果,如圖,滑鼠懸浮在地圖的右上角小框中時,提示“拖動調整大小”,可以給小框加個好看的圖示。點選可以進行拖拽。 基於上一篇部落格:https://blog.csdn.net/acoolgiser/article/details/84866426  實現。 程式碼:

linux升級python安裝pip

I. 升級python 本次選擇版本2.7.8,需要其他版本請移步:官方FTP wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tar.xz #如果tar版本過低,請使用xz -d xx.tar.xz

Consul 最新版叢集搭建(適用於 WindowsLinux,Mac)

本文采用Consul1.3.0版本進行叢集搭建。下面為詳細搭建步驟。 本位的叢集結構如下: IP type node name 配置檔案對應目錄 127.0.0.1 server server1 config1,data1 12

已知IP地址如何計算其子網掩碼預設閘道器地址網路地址

首先要鋪墊一些基礎知識,整個網際網路就是一個單一的、抽象的網路。IP地址就是給網際網路上的每一臺主機(或路由器)的每一個介面分配一個在全世界範圍內是唯一的 32 位的識別符號。注意,每個IP地址都是獨一無二的,就像人的身份證號碼一樣。 而IP地址又分為A類

CSS3字型示例背景圖變形基點

指定自動換行的處理方法 <style>         #div1{             word-break:keep-all;             當word-break屬性使用keep-all引數值時,對於中文來說,只能在半形空格        

關於對字串、陣列處理的常見問題與方法如獲取帶有空格字串長度陣列長度getline(),sprintf()使用

最近在刷題,遇到對字串處理的題目,真是有點頭疼。我先介紹幾個對字串操作非常實用的方法吧。 1.字串連線函式strcat(string catenate縮寫),函式原型為 strcat(char[ ], const char[ ]) #include <

【C++】編寫一個簡單的類包含建構函式成員函式

//編寫一個簡單的類。包含建構函式,成員函式等。 #include <iostream> using namespace std; class Rec { public: Rec(i

牛客網“程式發生段錯誤可能是陣列越界堆疊溢位(比如遞迴呼叫層數太多)”錯誤的可能原因

晚上在牛客網練習程式設計,做了一題網易的,很簡單的題但是會提示“程式發生段錯誤,可能是陣列越界,堆疊溢位(比如,遞迴呼叫層數太多)”,想來想去也不懂為什麼,本地可以測試通過,然後既沒有陣列越界也沒有呼叫遞迴。。。後面找到了原因,有可能是陣列界定太大了,在給陣列賦值的時候系統

除錯Fortran時 遇到"無法找到“XXX.exe”的除錯資訊或者除錯資訊不匹配未使用除錯資訊生成的二進位制檔案”的問題

解決辦法: 首先,選擇 配置屬性->Fortran->General->Debug information format,設定值為Full (/debug:full) ,如下圖   然後,選擇 配置屬性->Fortran->Debuging&

C++:Stack around the “tWindowString” was corrupted(堆疊損壞即記憶體溢位)

最近除錯程式的時候出現了這樣一個問題 其中關鍵性的內容有兩個:出現error的位置和error資訊。 可以看到錯誤位置在mytree.cpp的377行,問題原因是Run-Time Check Failure #2 - Stack around the “tWindowString” w

delphi 2010 啟動無響應過一段時間後出現“displayNotification:堆疊溢位”解決方法

現象:啟動delphi 2010 後無響應,過很久(幾十秒後),出現錯誤框“displayNotification:堆疊溢位”。 解決方法:開啟IE,在Internet選項中,刪除歷史記錄。 已經兩次遇到該問題了,每次都是從網上搜索解決方法,在此記錄一下。

Tomcat 記憶體溢位堆疊配置各種調整

部分參說明: -server:一定要作為第一個引數,在多個CPU時效能佳 -Xms:初始Heap大小,使用的最小記憶體,cpu效能高時此值應設的大一些 -Xmx:java heap最大值,使用的最大記憶體 -XX:PermSize:設定記憶

記憶體溢位記憶體洩露記憶體越界溢位

記憶體溢位:使用者要求系統分配的記憶體空間超出了系統所能提供的範圍,稱記憶體溢位 記憶體洩露:使用者向系統申請記憶體(new),使用完後沒有釋放的情況(delete),導致了該塊記憶體不能再被使用者使用,也不能被系統呼叫。我們常說的記憶體洩露指的是堆洩露 記憶體越界:使用已