C/C++程序调试和内存检测

程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正。减少程序错误最有效的方法是:在敲代码之前,多花点时间思考,如何构造程序,数据结构和算法,尽量把细节提前写下来,可以尝试着在纸上写出核心代码,这样可以减少今后修改代码的时间。
创一个小群,供大家学习交流聊天
如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀。
也希望大家对学C++能够持之以恒
C++爱好群,
如果你想要学好C++最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织:快乐学习C++组织 可以点击组织二字,可以直达请添加链接描述

1、常用的调试技巧



(1)代码检查,重新阅读程序,排除比较明显的错误。编译时带上-Wall参数,生成所有的警告信息。

gcc -Wall -pedantic -ansi 表示以ansi/iso生成所有的警告西信息。

(2)取样法:在程序中增加一些代码,收集更多与程序运行时的行为相关的信息。使用条件编译,可以清楚的辨别哪些是调试代码,有利于调试后的代码整理。

例如:

#ifdef DEBUG
 std::cout << x :
#endif

程序编译时可以选择性的加上-DDEBUG。如果加上这个标志,就定义了DEBUG这个符号,从而在程序中包含调试用的额外代码,没有加上该标志,这些调试代码将删除。

(3)程序的受控执行。用调试器来控制代码的运行,随时查看这些变量的状态。

为了能够调试程序,需要在编译和链接时为每个源文件加上编译选项参数。这些选项的作用是让编译器在程序中添加额外的调试信息。这些信息包括符号和源代码行号,调试器将利用这些信息向用户显示程序已经执行到的源代码的位置。-g标志是对程序调试性编译时常用的一个选项。调试信息的加入使可执行程序的长度成倍的增长、容量增加,程序运行时的内存数量还是和原来一样,程序调试结束后,最好还是将调试信息从程序的发行版中删除。
2、使用gdb进行程序调试

常用功能命令:

g++ -g -o test test.cpp //编译时加上-g参数

1、启动gdb: gdb test
2、help
3、具备带有历史记录的命令行编辑功能,方向键选择之前执行过的命令,直接回车键再次执行最近执行过的那条命令。单步调试非常有用。
4、quit:退出
5、run:执行这个程序,程序运行失败时gdb会报告失败的原因和位置。
6、backtrace(bt):栈跟踪,失败时停止的位置,帮助我们找到程序到达错误地点的路径。
7、print:run 后检查变量,注意变量的生命期。
8、打印围绕当前位置前后的一段代码,继续使用list可以显示更多的代码。
9、设置断点,停止程序的运行,查看变量。help breakpoint,break lineNumber,cont,end,display,disable breakpoint number,clear,commands breakpointNumber.
10、设置断点后经常使用单步调试命令next(n),查看程序运行的细节。
3、valgrind内存调试

动态内存分配很容易出现程序漏洞,必须清楚自己分配的每一块内存,而且要确定没有使用已经释放的内存块,非常重要。内存调试的工具有很多,这里使用的是valgrind工具。在centos 7中直接使用 yum install valgrind 安装。

#include <iostream>

int main()
{
int *ptr = new int [3];
ptr[3]=1;

delete [] ptr;
std::cout << ptr[1];
return 0;

}

上面简单的代码编译运行不会发生错误,但是实际上发生了很严重的内存问题。ptr[3]访问越界,std::cout <<ptr[i],读已经释放过的内存。

通过valgrind工具可以检查出来:

[xgwang@localhost Desktop]$ g++ -g -o test2 test2.cpp
[xgwang@localhost Desktop]$ valgrind ./test2
==21739== Memcheck, a memory error detector
==21739== Copyright (C) 2002-2013, and GNU GPL‘d, by Julian Seward et al.
==21739== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==21739== Command: ./test2
==21739==
==21739== Invalid write of size 4
==21739== at 0x40081E: main (test2.cpp:8)
==21739== Address 0x5a1504c is 0 bytes after a block of size 12 alloc‘d
==21739== at 0x4C2A7AA: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21739== by 0x400811: main (test2.cpp:7)
==21739==
==21739== Invalid read of size 4
==21739== at 0x40083F: main (test2.cpp:11)
==21739== Address 0x5a15044 is 4 bytes inside a block of size 12 free‘d
==21739== at 0x4C2B5E1: operator delete (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21739== by 0x400836: main (test2.cpp:10)
==21739==
0==21739==
==21739== HEAP SUMMARY:
==21739== in use at exit: 0 bytes in 0 blocks
==21739== total heap usage: 1 allocs, 1 frees, 12 bytes allocated
==21739==
==21739== All heap blocks were freed -- no leaks are possible
==21739==
==21739== For counts of detected and suppressed errors, rerun with: -v
==21739== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 2 from 2)

原文地址:https://blog.51cto.com/14209412/2356600

时间: 2024-11-10 00:53:14

C/C++程序调试和内存检测的相关文章

【调试】Linux下超强内存检测工具Valgrind

[调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Linux下,开放源代码(GPLV2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成. 内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.

[Swift通天遁地]七、数据与安全-(11)如何检测应用程序中的内存泄露

本文将演示使用Instruments Allocations工具检测应用程序中的内存泄漏问题. 内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光. 在项目文件夹[DemoApp]上点击鼠标

Cocos2d-x开发---关于内存检测

这几天面试的时候,面试官都会问我在游戏开发过程中是如何应对内存检测的,如何监控程序是否有内存泄漏的问题.在开发的过程中也没有认真的注意过这个问题(当然不是说不去关注程序的内存泄漏问题,而是说并没有特意到去思考如何去监控),因为上家公司使用的是xcode开发工具,其自带了性能监控的工具,平时也就是用的这个,可能没太在意这些吧. 因为面试官问这个比较多,然后我感觉自己确实需要多注意注意程序开发过程中的一些基础性问题,所以把自己所知道的整理整理. Mac上: 使用xcode进行开发,当运行模拟器或者进

.NET应用程序调试—原理、工具、方法

阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.SOSEX.DLL 2.3.调试系统的基本流程及架构(.NETDAC概念.mscordacwks.dll) 2.4.VisualStudio中集成扩展调试(更加细粒度的调试程序) 3.调试程序类型(客户端程序.服务端程序) 4.调试方式及场景 4.1.本机调试(Attach Process,调试器启动

嵌入式linux应用程序调试方法

嵌入式linux应用程序调试方法 四 内存工具 17 4.1 MEMWATCH 17 4.2 YAMD 22 4.3 Electric Fence 24 五 C/C++代码覆盖.性能profiling工具 24 5.1 用gcov来测试代码覆盖率 25 5.2 使用gprof来优化你的C/C++程序 35 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来跟踪稀奇古怪的内存错误问题.应用程序在有的开发工作站上能运行,但在新的产品工作站上,这个应用

iOS Instruments内存检测使用

Instruments 可以帮我们了解到应用程序使用内存的几个方面: 全局内存使用情况(Overall Memory Use): 从全局的角度监测应用程序的内存使用情况,捕捉非预期的或大幅度的内存增长. 内存泄露(Leaked memory): 未被你的程序引用,同时也不能被使用或释放的内存. 废弃内存(Abandoned memory): 被你的程序引用,但是没什么卵用的内存. 僵尸对象(Zombies): 僵尸对象指的是对应的内存已经被释放并且不再会使用到,但是你的程序却在某处依然有指向它的

内存检测

TBOX的内存分配在调试模式下,可以检测支持内存泄露和越界,而且还能精确定位到出问题的那块内存具体分配位置,和函数调用堆栈. 内存泄露检测 内存泄露的检测必须在程序退出的前一刻,调用tb_exit()的时候,才会执行,如果有泄露,会有详细输出到终端上. tb_void_t tb_demo_leak() { tb_pointer_t data = tb_malloc0(10); } 输出: [tbox]: [error]: leak: 0x7f9d5b058908 at tb_static_fix

C/C++内存检测工具Valgrind

内存检测Valgrind简介 Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O'Reilly开源大奖的Julian Seward, 它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测, 我们可以使用它的工具:Memcheck.   Valgrind 安装 方法 1.  valgrind官网:http://valgrind.org下载 方法 2.  Ubuntu  sudo a

程序员突围-程序调试分析(一) 我从菜鸟进化的感悟

程序员突围-程序调试分析(一) 我从菜鸟进化的感悟 在说程序调试分析之前,我们还是了解一些基本的概念性的东西(在下现在从事java,因而都已java为例) 1. bug的分类 根据程序的阶段和MSDN和看过的一些书籍的分析,bug分为编译错误,运行时错误和逻辑的错误 (1)  编译错误 一般初学者犯错比较多的地方,编译错误,说白了就是程序在从java编译成.class文件时出现了问题,这个问题的现象比较明显,比如说语句写的有问题,那么对于这类问题的解决方法是什么呢,翻翻书,翻翻API(翻阅API