About Debug

本文介绍如何使用Microsoft Visual C++中的调试宏和内存管理工具来检测和定位内存泄漏。提供了MFC中常用的调试宏用法,并推荐了MemoryManager工具,通过实例演示了如何在项目中应用此工具进行内存泄漏检测。
部署运行你感兴趣的模型镜像
Detecting and Isolating Memory Leaks Using Microsoft Visual C++
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include "crtdbg.h"
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
 
main
{
 // Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
}

MFC中一些用于调试的宏。
1.   ASSERT(a < 1);
2.   VERIFY(pWnd = GetDlgItem(IDC_MYEDIT));
3.   TRACE("Name: %s/n", obj.name());
4.   INFO("Name: %s/n", obj.name());
5.   DBG(AfxMessageBox("I'm here!"));
6.   BREAK();
 
评价很高的内存漏洞检测工具Memory Manager by Paul Nettle改进版
补充,链接一是作者原始发布的版本,只需要添加 mmgr.cpp, mmgr.h, nommgr.h 三个文件到项目即可;改进版(非原作者),则需要添加更多的文件,使用没有链接一方便。
个人使用经验:一、在所有的.cpp文件均加入"#ifndef NDEBUG#include "mmgr.h"#endif",放置在包含文件之末,因为该库很容易与其它系统库冲突。
                    二、不要在DLL源文件中使用该库,会造成使用该DLL的项目无法正常使用该库。
                    三、若日志文件中显示??:??等未知位置的内存泄露,那么可以锁定是在.h中的指针未释放。不将mmgr.h包含在头文件中,也是因为容易造成冲突问题。

您可能感兴趣的与本文相关的镜像

AutoGPT

AutoGPT

AI应用

AutoGPT于2023年3月30日由游戏公司Significant Gravitas Ltd.的创始人Toran Bruce Richards发布,AutoGPT是一个AI agent(智能体),也是开源的应用程序,结合了GPT-4和GPT-3.5技术,给定自然语言的目标,它将尝试通过将其分解成子任务,并在自动循环中使用互联网和其他工具来实现这一目标

### 作用 `#ifdef DEBUG` 是 C 和 C++ 等编程语言中的预编译指令,属于条件编译指令,它决定了哪些代码会被编译,哪些不会被编译。通过 `#ifdef DEBUG` 可以定义调试信息,在生产环境中禁用调试代码,有助于在开发过程中进行调试,同时避免在生产环境中引入不必要的调试代码[^1][^3]。 ### 使用方法 以下是几种常见的使用方法: - **基本使用**:通过 `#define` 定义 `DEBUG` 宏,然后使用 `#ifdef DEBUG` 来判断是否编译调试代码。 ```c #define DEBUG #ifdef DEBUG std::cout << "Debugging: Value of x is " << x << std::endl; #endif ``` - **结合多条件组合**:可以与其他条件一起使用,例如 `#if defined(STM32F4) && (CLOCK_SPEED > 16)` ,仅在 STM32F4 且时钟速度大于 16MHz 时编译特定代码[^2]。 - **反向检查**:使用 `#if !defined(USE_UART)` ,如果 `USE_UART` 未定义,则编译此部分代码[^2]。 - **在实际程序中使用**:在一个包含用户交互的程序中,可以使用 `#ifdef DEBUG` 输出调试信息。 ```c #include <stdio.h> #include <stdlib.h> #define DEBUG int main(void) { int i = 0; char c; while(1) { i++; c = getchar(); if('\n' != c) { getchar(); } if('q' == c || 'Q' == c) { #ifdef DEBUG printf("We get:%c,about to exit.\n",c); #endif break; } else { printf("i = %d",i); #ifdef DEBUG printf(",we get:%c",c); #endif printf("\n"); } } printf("Hello World!\n"); return 0; } ``` ### 应用场景 - **调试信息输出**:在开发过程中,通过 `#ifdef DEBUG` 输出变量的值、函数的调用情况等调试信息,方便定位问题。在生产环境中,只需移除 `#define DEBUG` ,这些调试信息就不会被编译,避免对性能产生影响[^1]。 - **平台相关代码**:不同的硬件平台或操作系统可能需要不同的代码实现。可以使用 `#ifdef` 结合平台相关的宏定义,编译特定平台的代码。 - **功能开关**:可以通过定义不同的宏来开启或关闭某些功能,方便进行功能测试和版本管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值