美文网首页
C/C++程序调试和内存检测

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

作者: 代码人生ll | 来源:发表于2019-03-01 11:51 被阅读0次

程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正。减少程序错误最有效的方法是:在敲代码之前,多花点时间思考,如何构造程序,数据结构和算法,尽量把细节提前写下来,可以尝试着在纸上写出核心代码,这样可以减少今后修改代码的时间。

创一个小群,供大家学习交流聊天

如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀。

也希望大家对学C++能够持之以恒

C++爱好群,

如果你想要学好C++最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织:快乐学习C++组织 可以点击组织二字,可以直达

1、常用的调试技巧

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

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

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

例如:

#ifdefDEBUG

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>

intmain()

{

int*ptr =newint[3];

ptr[3]=1;

delete[] ptr;

std::cout<< ptr[1];

return0;

}

上面简单的代码编译运行不会发生错误,但是实际上发生了很严重的内存问题。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[](void*) (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)

相关文章

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

    程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正。减少程序错误最有效的方法是:在敲代码之前,多花点...

  • Java虚拟机(一)——JVM内存分类

    传统程序语言:由程序员手动内存管理。C/C++,malloc申请内存和free释放内存,经常导致内存泄漏。 现代程...

  • linux编程入门(七)-使用gdb调试程序

    程序开发离不开调试,可以断点调试,也可以打log调试,linux下断点调试c,c++程序用gdb。 断点调试虽然很...

  • gdb调试C/C++程序的方法

    一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文...

  • windows逆向3

    VC 程序内存和编译的一些特征C++ 构造函数C++ 成员函数C++ 析构函数C++ 全局对象的构造C++ 全局对...

  • 内存池

    参考资料 C++内存池介绍与经典内存池的实现 C++ 应用程序性能优化,第 6 章:内存池 linux c++ 内...

  • 百度Linux C++后台开发面试题(个人整理)

    1、C/C++程序的内存分区 其实C和C++的内存分区还是有一定区别的,但此处不作区分: 1) 、栈区(stack...

  • C++_day06

    C++核心编程 主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓 1. 内存分区模型 C++程序...

  • C++运算符重载实现(加号、左移、递增、赋值、关系运算符、函数调

    先来复习一下C++的内存分区问题~ C++内存分区 C++程序的内存分区可划分为四大内存分区:堆、栈、全局/静态存...

  • Mac使用vscode调试c/c++

    mac上在vsCode上进行c/c++程序的调试 目的在mac上使用vscode 和 lldg/gdb调试工具 对...

网友评论

      本文标题:C/C++程序调试和内存检测

      本文链接:https://www.haomeiwen.com/subject/bixduqtx.html