1. 程式人生 > >Windows C++程式設計的一些除錯和檢測方法

Windows C++程式設計的一些除錯和檢測方法

1、記憶體洩露的檢測

     之前也用到了一些記憶體洩露的檢測方法。知道大概的原理就是竄改記憶體分配的函式,在原始的分配基礎(記憶體大小)上新增一些記錄分配記憶體的資訊,如檔案、分配程式碼的行號。Windows程式設計中SDK、MFC提供的一些檢測函式因為竄改的記憶體分配函式不同,所以檢測的範圍也不盡相同。

      因為之前的工作中使用MFC來實現系統介面,所以大部分程式碼都是連結的MFC庫,而非Windows標準庫,使用記憶體分配的函式是new,而非malloc,所以一般都用MFC提供的DEBUG_NEW來檢測。一般會在檔案的開頭處使用下面的巨集替換(這在MFC檔案中非常常見):

       #ifdef _DEBUG
       #define new DEBUG_NEW
       #undef THIS_FILE
       static char THIS_FILE[] = __FILE__;
      #endif

這樣在程式中使用new就會被DEBUG_NEW代替,DEBUG_NEW過載了new,所以在程式結束時,檢測分配連結串列是否為空,非空則打印出相應的洩露程式碼行。

在afx.h中,定義DEBUG_NEW:

// Memory tracking allocation
void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
#define DEBUG_NEW new(THIS_FILE, __LINE__)

注意的是,此處DEBUG_NEW 僅僅只是替換new,所以只對new的記憶體分配具有作用,不能檢測malloc分配的記憶體。另外,DEBUG_NEW替換了new,過載了函式,對那些本身就過載了new的類會有影響,使其不能正確的呼叫合適的new函式,發生錯誤,使用時也應格外小心這一點。

     以前雖然知道Windows提供了一些CRT的DEBUG方法類檢測記憶體洩露,但一直沒有使用過,前段時間找工作時,有被人問到,最近工作中看到公司的一些原來的程式碼中也有所使用。

      #ifdef _DEBUG
                _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
      #endif 

具體參考MSDN:

Call _CrtSetDbgFlag with newFlag equal to _CRTDBG_REPORT_FLAG to obtain the current _crtDbgFlag

state

然後設定_CRTDBG_LEAK_CHECK_DF,這樣就可以檢測記憶體洩露問題了。

使用注意,需要載入標頭檔案#include <crtdbg.h>,這樣可以對malloc和new分配的記憶體同時檢測。

2、特殊巨集

     巨集的使用可以幫助有效定位,錯誤發生的位置,MSVC中一般在Output視窗中輸出檔名(程式碼行),雙擊該條目即可定位。

一般可寫為TRACE(".......%s(%d)", __FILE__, __LINE__);

之前轉載的文章《C/C++語言巨集定義技巧》中有提到過這些巨集(如_ L I N E _ 、_ F I L E _ 、_ D A T E _ 、_ T I M E _ 、_ S T D C _ ),具體可翻閱相關編譯器資料,今天提到一個新的巨集__FUNCTION__來獲取函式名,據說VC6不支援,未嘗試過,使用時應該注意編譯器的版本和支援情況。

 3、NT服務程式除錯

     之前一直沒有寫過NT服務的後臺程式,最近負責檢視一個NT服務程式,所以需要除錯。在自己沒有想到辦法的時候,只能求助於MSDN和網路。網路搜尋還是比較快捷的,抄在下面:

除錯 Windows 服務應用程式

  1. 安裝您的服務。有關更多資訊,請參見安裝和解除安裝服務
  2. 可從服務控制管理器、“伺服器資源管理器”或程式碼啟動服務。有關更多資訊,請參見啟動服務
  3. 在 Visual Studio 中,從“除錯”選單中選擇“程序”。

    出現“程序”對話方塊。

  4. 單擊“顯示系統程序”。
  5. 在“可用程序”區域內單擊服務的程序,然後單擊“附加”。
    提示   此程序將與服務的可執行檔案同名。

    出現“附加到程序”對話方塊。

  6. 選擇任意適當選項,然後單擊“確定”關閉對話方塊。
    注意   您現在已處於除錯模式。
  7. 設定要在程式碼中使用的任意斷點。
  8. 訪問服務控制管理器並操縱您的服務,併發送停止、暫停和繼續命令以命中您的斷點。有關執行服務控制管理器的更多資訊,請參見啟動服務

相關推薦

Windows C++程式設計一些除錯檢測方法

1、記憶體洩露的檢測      之前也用到了一些記憶體洩露的檢測方法。知道大概的原理就是竄改記憶體分配的函式,在原始的分配基礎(記憶體大小)上新增一些記錄分配記憶體的資訊,如檔案、分配程式碼的行號。Windows程式設計中SDK、MFC提供的一些檢測函式因為竄改的記憶體分配函

WIndows 系統下的常用命令 檢測方法

一、檢測硬碟速度(Windows 自帶工具)   使用windows 系統自帶的工具測試硬碟讀寫速度    在使用下面命令前,需要獲得管理員許可權,才會在Dos視窗上顯示(否則,一閃而過)     winsat disk -drive + 磁碟符(c、e、f) 二、常見的windows自帶工具/命令

c++ 程式崩潰的除錯解決方法

程式崩潰是我以前很頭疼的問題,尤其是有時出現,有時不出現的問題,除錯也抓不到,這種清空我們通常是通過在exe程式崩潰時生成dump檔案來定位的; 首先在程式碼中  main.cpp中定義函式: LONG WINAPI UnhandledExceptionFilter_SpawD

c# partial 分部類分部方法

chan inline -m 約束 程序員 窗體 studio idt 實現 一、partial   它是一個關鍵字修飾符。可以將類或結構、接口或方法的定義拆分到兩個或更多個源文件中。 每個源文件包含類型或方法定義的一部分,編譯應用程序時將把所有部分組合起來。修飾符不可用

C# Monitor的WaitPulse方法使用詳解

center 順序 不能 counter 效率 其中 作者 重點 lock 【轉載】http://blog.csdn.net/qqsttt/article/details/24777553 Monitor的Wait和Pulse方法在線程的同步鎖使用中是比較復雜的,理解稍微

配置MySQL時,遇到的一些問題解決方法

Q1.配置好路徑和環境變數以後,準備安裝mysql,但是顯示MySQL服務無法啟動 A:網上查了好多解決辦法,最後解決辦法是需要初始化,操作步驟為: mysql -remove mysql -install mysql -initialize Q2.正常啟動mysql後,輸入

愛奇藝2018秋招C++ [程式設計題]紅

連結:https://www.nowcoder.com/questionTerminal/4ea618c551404efc8299c2eaac733329 來源:牛客網 牛牛有一些排成一行的正方形。每個正方形已經被染成紅色或者綠色。牛牛現在可以選擇任意一個正方形然後用這兩種顏色的任意一種進

C#中靜態變數 靜態方法

C#中靜態變數和 靜態方法 static節省了構造物件時造成的效能損耗,其次還能用於一些特殊環境(如惡漢式單例) 但是由於靜態成員在程式載入之前就進入記憶體,直到程式結束才會銷燬,所以 在程式中如果大量使用static來宣告型別或成員,也會造成系統資源的浪費。 一般靜態的就代表全域性。表示任何類

C#之抽象類抽象方法

一、前言 在學習C#的時候經常會看到一個名詞“抽象類”,那什麼是抽象類,抽象類是用來幹什麼的,在看了很多部落格和資料,都說的很官方,理解起來很難,並且好多部落格資料都是不斷地抄襲抄襲,寫的千篇一律,基本都很相似,那下面小編就根據自己的理解說以下抽象來,結合抽象類把抽象方法也說了。 抽象方

面向物件程式設計-私有屬性私有方法

1.私有屬性 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:James Tao 4 class Role(object):#執行時之後就存在記憶體裡 5 6 #建構函式 7 #作用:在例項化時做一

如何學好windows c++程式設計 學習精髓(收集,整理)

/;;看看,可以找到《深入淺出MFC》2e電子版下載! 有一本書很好《WIN32程式設計師參考大全》即可瞭解WIN C SDK,又可以瞭解WINDOWS,一舉兩得。就是有好幾本。可以到VC知識庫網站的電子圖書欄目下載。 我認為需要三本書, 1 <<windows 高階程式設計指南>>

(轉)學習ffmpeg官方示例transcoding.c遇到的問題解決方法

轉自:https://blog.csdn.net/w_z_z_1991/article/details/53002416  Top 最近學習ffmpeg,官網提供的示例程式碼transcoding.c演示了編解碼和濾波器的使用,不過第一步的編譯執行測試就卡了好久,今天終於找到了原因了,趕緊記錄一

做網頁時遇到的一些問題解決方法

建立word文件: 在建立word文件時,如果此時Microsoft office word正處於開啟狀態,此時,是不能向word文件中寫入資料的,但是可以建立word文件。 建立word文件時,建立之後一定要關閉,否則,會提示檔案正在被佔用的錯誤 具體做法:File.Cr

Linux C程式設計一些函式彙總

  之前專案用到的函式彙總一下: 1.access 原型:int access(const char *filenpath, int mode); 標頭檔案:io.h 功 能: 確定檔案或資料夾的訪問許可權。檢查某個檔案的存取方式,比如說是隻讀方式、只寫方

C#中的getset 方法

set()是給屬性賦值的,get()是取得屬性值的 被設定和存取的屬性一般是私有 主要是起到封裝的作用,不允許直接對屬性操作 set()和get()不一定同時存在,看程式需求 釋一:屬性的訪問器包含與獲取(讀取或計算)或設定(寫)屬性有關的可執行語句。 訪問器宣告可以

windows核心程式設計-獲得環境變數的方法

一:使用_environ獲得環境變數#include<windows.h> #include<stdio.h> int main() { char** p = _environ;//這是一個指向字串陣列的指標 while (*p != NULL)

c#--怎樣使用c#中的indexofsubstring方法

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Con

kylin安裝以及遇見到的一些問題解決方法

環境: 三臺hadoop叢集,hive,hbase,zookeeper 三臺機器內網互相通訊,配置有一個外網ip,使用nginx埠對映 kylin安裝: 安裝部分參考文件: https://blog.csdn.net/seashouwang/article/detail

設計實現OJ平臺的遇到的一些問題解決方法

需求 畢業設計,實現一個能夠自動編譯、執行、監測程式執行使用資源、惡意系統呼叫的監控的一個OJ平臺。 在設計實現的過程中的想法、碰到的問題、求解的過程以及方法,在這裡記錄下來。 基礎結構 OJ主要由前端系統(WEB)和後端的判題程式構成,想法是後端的

安裝myeclipse遇到的一些問題解決方法

1、無法開啟myeclipse.exe,需要通過點選eclipsec.exe才能開啟。後來就修改了安裝目錄下 configuration>.setting>org.eclipse.ui.ide.prefs裡面的 SHOW_WORKSPACE_SE