cfree运行程序错误_C/C++程序调试和内存检测

f7e0eaf08ebfa87609e86d5a687e1336.png

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

1、常用的调试技巧

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

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

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

例如:

80c9258b89b0d6b94189bd1565acb293.png

程序编译时可以选择性的加上-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 安装。

458dfcf953ae956aa1cc75e02a02af49.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

session的removeattribute移除一个不存在的属性会怎么用_公认峡谷机制最完美,对线几乎无解,夏侯惇高端局为何火不起来?...

Hello各位亲爱的小伙伴们&#xff0c;大家好&#xff0c;我是沐辰。在王者荣耀中始终有这么一个说法&#xff1a;“夏侯惇是王者峡谷机制最完美的英雄”&#xff0c;当然这个可不是沐辰胡编乱造&#xff0c;而是策划在数年前就曾公开发表过的看法。从机制上来&#xff0c;夏侯惇…

python图标的演变_python day 22 CSS拾遗之箭头,目录,图标

lanxing4. CSS拾遗之箭头画法.up { border-top: 30px solid green; border-right: 30px solid transparent; border-bottom: 30px solid transparent; border-left: 30px solid transparent; display: inline-block; } .down { border-top: 30px solid transparent; border-rig…

PHP中生成UUID

一、什么是UUID 简单的说UUID就是一串全球唯一的(16进制)数字串。 UUID的全拼为“Universally Unique Identifier”&#xff0c;可以译为“通用唯一识别码”。UUID由开源软件基金会 (Open Software Foundation, OSF) 定义&#xff0c;是分布式计算环境 (Distributed Computing …

岗位po是什么意思_面试时,面试官问你有什么优点和缺点?应该如何巧妙的回答?...

工作多年&#xff0c;被面试过很多次&#xff0c;也面试过很多人&#xff0c;其中有一次印象最深刻&#xff0c;这次我不是主面试官&#xff0c;经理要面试一个候选人&#xff0c;他就拉上了我&#xff0c;作为陪衬&#xff0c;用经理的话说就是撑撑场面&#xff0c; 所以问题的…

java中Collection集合、Iterator迭代器接口、for each循环遍历集合或对象

Collection集合&#xff1a; 概念&#xff1a;集合是java中提供一种存储多个数据的容器;数组也是存储数据的容器&#xff0c;集合和数组的区别就是集合的长度可以改变&#xff0c;而数组的长度不可以改变&#xff1b;集合可以存储多种类型的对象数据&#xff0c;而数组只能存储…

工业镜头选型计算公式_变压器分接开关选型指南

如何选择变压器适用的分接开关型号&#xff1f;选型中又有哪些值得注意的事项呢&#xff1f;小编特别整理提炼了分接开关选型指南&#xff0c;让我们一起来看一下。分接开关的产品型号示例如下&#xff1a;型号中的各项参数和规格可通过以下步骤计算确定&#xff1a;1、确定调压…

icmp端口_pingtunnel搭建icmp隧道

说明pingtunnel可以将udp、tcp、sock5流量伪装成icmp传输&#xff0c;地址&#xff1a;https://github.com/esrrhs/pingtunnel/&#xff0c;详细说明和用法可参考官方说明。示例图客户端运行在攻击机&#xff0c;服务端运行在受害机。情况如下&#xff1a;通过pingtunnel搭建一…

node中使用短信验证功能(阿里云为例)

一、选择短信平台 短信平台有很多&#xff0c;这里我选择阿里云&#xff0c;详细步骤如下&#xff1a; 进入短信控制台&#xff0c;对要发送的短信格式进行配置&#xff0c;如果没有签名&#xff0c;需要申请签名后操作&#xff08;注意&#xff1a;需要自己已有阿里云账号且实…

如何画圆柱_什么是最速降线?如何来验证一下呢?这里用SolidWorks来试一试

一个仅受重力的物体&#xff0c;从一个点出发&#xff0c;沿着一条没有摩擦的斜坡滚动到另外一个点。肯定有一个斜坡使物体运动的时间最短。这个斜坡所在的曲线就是“最速降线”。关于这个最速降线是怎么计算出来&#xff0c;我并不知道&#xff0c;但是他有一个结论&#xff0…

根据用户id查询菜单列表(菜单权限问题)

根据用户id查询菜单列表&#xff08;菜单权限问题&#xff09;&#xff1a; 最高级用户菜单效果图&#xff1a; 较低级别用户菜单效果图&#xff1a; SQL语句分析图&#xff1a; 根据用户id查询对应菜单&#xff08;权限&#xff09;SQL语句&#xff1a; SELECT * FROM us…

pycharm中配置r语言_【R语言】R语言中的循环

编程中减少代码重复的两个工具&#xff0c;一是循环&#xff0c;一是函数。循环&#xff0c;用来处理对多个同类输入做相同事情&#xff08;即迭代&#xff09;&#xff0c;如对不同列做相同操作、对不同数据集做相同操作。R语言有三种方式实现循环&#xff1a;&#xff08;1&a…

钉钉api 获取 accesstoken_Thinkphp5.X异常接管后通过钉钉机器人推送通知

大多团队在生产环境下都会关闭app_debug&#xff0c;所以相对应的错误信息就不能实时查看到。以下分享一个目前团队项目正在用的生产环境下相关技术人员能第一时间获取通知的方法&#xff1a;先上效果图&#xff1a;以上通知是在钉钉中显示&#xff01;下面介绍开发步骤&#x…

js中将有层级关系的一维数据转换为父子级关系的二维数据、菜单权限三级层级数据实现(树形结构数据)

很久没有发文了&#xff0c;今天发点不一样的&#xff0c;如下&#xff1a; <script>// 一维数据&#xff1a;let arrData[{ r_id: 1, role_name: 开发商, n_id: 1, txt: 主页 },{ r_id: 1, role_name: 开发商, n_id: 2, txt: 项目 },{ r_id: 1, role_name: 开发商, n_id…

修改器内置脚本编写_Node.js 中实践 Redis Lua 脚本

对别人的意见要表示尊重。千万别说&#xff1a;"你错了。"——卡耐基Lua 是一种轻量小巧的脚本语言&#xff0c;用标准 C 语言编写并以源代码形式开放&#xff0c;其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。由于 Lua 语言…

项目上线,部署到服务器(腾讯服务器),http协议及https协议(微信小程序必须https协议才可发布)

一、准备服务器&#xff1a; 1.选择自己的服务器&#xff0c;这里有很多服务器比如&#xff0c;阿里服务器&#xff0c;腾讯服务器等&#xff0c;这里我选择腾讯服务器做测试&#xff0c;其官网&#xff1a;https://cloud.tencent.com/&#xff0c;微信扫码登录后如下进入首页…

队列的基本操作_算法与数据结构(五) 栈和队列

? 工欲善其事&#xff0c;必先利其器。栈和队列 - Stack And Queue栈如何理解栈呢&#xff1f;后进者先出&#xff0c;先进者后出&#xff0c;这就是典型的 "栈" 结构。04_栈和队列-栈结构从栈的操作特性上来看&#xff0c;栈是一种“操作受限”的线性表&#xff0c…

八邻域轮廓跟踪算法_结合mRMR选择和IFCM聚类的遥感影像分类算法

随着遥感成像技术的发展&#xff0c;高分遥感影像空间分辨率逐年提高&#xff0c;已经成为获取地物信息的主要数据来源之一。高分影像分类作为遥感影像处理的重要任务之一&#xff0c;在地理国情普查与监测、数字城市建设、城市规划等领域具有广阔的应用前景。高分影像具有纹理…

node.js中net模块、node实现tcp通信

node.js中net 一、net模块感知&#xff1a; net模块用于创建基于TCP&#xff08;或IPC&#xff09;通信的服务器或客户端&#xff0c;它是nodejs内置模块&#xff0c;直接使用require(‘net’)的方式引入&#xff0c;类似http模块。 二、创建一个tcp服务器&#xff1a; //1…

struts2--文件上传大小

struts2--文件上传大小 Struts2文件上传的大小限制问题 问题&#xff1a;上传大文件报错……解决&#xff1a;修改struts.xml文件中的参数如下<constant name"struts.multipart.maxSize" value"55000000"/><action name"UploadFile" cl…

element-plus中导航高亮不自动刷新问题

解决使用element-plus el-submenu时页面被this.$router.push(“xxx”)跳转后&#xff0c;导航菜单高亮不能自动刷新问题&#xff0c;需要注意以下几点&#xff1a; 在el-menu加上routerindex必须绑定路由的path,参考上面的例子&#xff0c;/不能少default-active设为当前路由&…