调试内存_C/C++程序调试和内存检测
来源:wxquare
www.cnblogs.com/wxquare/p/4840063.html
程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正。减少程序错误最有效的方法是:在敲代码之前,多花点时间思考,如何构造程序,数据结构和算法,尽量把细节提前写下来,可以尝试着在纸上写出核心代码,这样可以减少今后修改代码的时间。
1、常用的调试技巧
(1)代码检查,重新阅读程序,排除比较明显的错误。编译时带上-Wall参数,生成所有的警告信息。
gcc -Wall -pedantic -ansi 表示以ansi/iso生成所有的警告西信息。
(2)取样法:在程序中增加一些代码,收集更多与程序运行时的行为相关的信息。使用条件编译,可以清楚的辨别哪些是调试代码,有利于调试后的代码整理。
例如:
#ifdef DEBUG std::cout < #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
int main(){ int *ptr = new int [3]; ptr[3]=1;
delete [] ptr; std::cout <1]; return 0;}
上面简单的代码编译运行不会发生错误,但是实际上发生了很严重的内存问题。ptr[3]访问越界,std::cout <
通过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++程序调试和内存检测相关推荐
- cfree运行程序错误_C/C++程序调试和内存检测
程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正.减少程序错误最有效的方法是:在敲代码之前,多花点时间思考,如何构造程序,数据结构和算法,尽量把细节提前写下来,可以尝试着在纸上写出核心 ...
- c++ fork 进程时 共享内存_c/c++ Linux 进程间通信------共享内存
1. 什么是共享内存 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是 ...
- [内存泄漏]pppd程序导致的内存泄漏
线上设备出现了内存泄漏,查看相关信息,发现是隐性内存占用过高导致.查阅内存泄漏定位思路和方法,没有找到问题原因. 查看线上内存历史统计,发现内存上涨很有规律,大概6天上涨到100%.然后因为内存不足, ...
- kiel实现c语言编程,Kiel 软件的使用和简单C程序调试
<Kiel 软件的使用和简单C程序调试>由会员分享,可在线阅读,更多相关<Kiel 软件的使用和简单C程序调试(15页珍藏版)>请在人人文库网上搜索. 1.单片机原理与接口技术 ...
- 程序调试介绍及其使用
文章目录 调试 一.程序调试概念 二.程序调试步骤 三.Windows环境下调试 四.调试快捷键 五.调试可以做什么 1.查看临时变量的值 2.查看内存信息 3.查看调用堆栈 4.查看汇编信息 5.查 ...
- Qt Creator调试C ++示例应用程序
Qt Creator调试C ++示例应用程序 调试C ++示例应用程序 调试C ++示例应用程序 本节使用TextFinder示例来说明如何在"调试"模式下调试Qt C ++应用程 ...
- 应用程序调试技术(更新程度:完毕)送源码及PPT
课程简介 调试技术实务分为调试基本概念和设置,Windows下常用到调试工具VS和Windbg的使用,自动化调试技术,以及实际调试场景示例等.不仅仅是介绍枯燥的程序调试技术,而是深入的从操作系统实现以 ...
- kiel实现c语言编程,单片机实验1(Kiel-软件的使用和C程序调试)教学文案(18页)-原创力文档...
单片机原理与接口技术实验 实验一:Kiel 软件的使用和C程序调试一.实验目的: 1.通过实验学会用C语言进行程序的设计. 2.学会应用keil-uvision集成调试软件对C语言程序进行调试.掌握C ...
- C# 编程入门第五课,VS2019程序调试,for循环,水仙花数,Console.Write,又一种类型变换,三元表达式,产生随机数
C# 编程入门第五课 文章目录 C# 编程入门第五课 1. VS2019程序调试 2. for循环 3. 水仙花数 4. Console.Write() 5. 又一种类型变换 6. 三元表达式 7.产 ...
最新文章
- 深度学习在超市商品识别中的解决方案分享
- android url webview,android - webview获取到当前页面的url
- 【Python相关】jupyter平台最强插件没有之一
- 破解mysql数据库的密码
- RN子组件获取redux数据
- 冲浪科技获Ventech China数百万美元天使轮融资,发力自动驾驶行业
- (十二)Linux内核驱动之poll和select
- 纯javaweb项目整合quarz定时器
- 学习MongoDB 六: MongoDB查询(游标操作、游标信息)(三)
- ska测试软件怎么用,wow伤害测试软件SIMC怎么用?SIMC使用详细攻略
- 深圳大学计算机考研教材,广东-深圳大学计算机考研院校初试科目及参考书汇总...
- 在尚硅谷自学Java全栈工程师课程
- HikariPool-1 - Connection is not available, request timed out after 6000ms
- 计算机里的文案怎么设置背景,如何将图片设置为Word文档的背景
- web前端二维码打印模板编辑
- CVE PoC的精选列表(二)
- 2.1 被隐藏了的过程
- AJAX读取Json文件
- classnames库的简单使用
- 【Web技术】网站留言系统开发,及留言信息实时发送至指定邮箱