来源: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++程序调试和内存检测相关推荐

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

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

  2. c++ fork 进程时 共享内存_c/c++ Linux 进程间通信------共享内存

    1. 什么是共享内存 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是 ...

  3. [内存泄漏]pppd程序导致的内存泄漏

    线上设备出现了内存泄漏,查看相关信息,发现是隐性内存占用过高导致.查阅内存泄漏定位思路和方法,没有找到问题原因. 查看线上内存历史统计,发现内存上涨很有规律,大概6天上涨到100%.然后因为内存不足, ...

  4. kiel实现c语言编程,Kiel 软件的使用和简单C程序调试

    <Kiel 软件的使用和简单C程序调试>由会员分享,可在线阅读,更多相关<Kiel 软件的使用和简单C程序调试(15页珍藏版)>请在人人文库网上搜索. 1.单片机原理与接口技术 ...

  5. 程序调试介绍及其使用

    文章目录 调试 一.程序调试概念 二.程序调试步骤 三.Windows环境下调试 四.调试快捷键 五.调试可以做什么 1.查看临时变量的值 2.查看内存信息 3.查看调用堆栈 4.查看汇编信息 5.查 ...

  6. Qt Creator调试C ++示例应用程序

    Qt Creator调试C ++示例应用程序 调试C ++示例应用程序 调试C ++示例应用程序 本节使用TextFinder示例来说明如何在"调试"模式下调试Qt C ++应用程 ...

  7. 应用程序调试技术(更新程度:完毕)送源码及PPT

    课程简介 调试技术实务分为调试基本概念和设置,Windows下常用到调试工具VS和Windbg的使用,自动化调试技术,以及实际调试场景示例等.不仅仅是介绍枯燥的程序调试技术,而是深入的从操作系统实现以 ...

  8. kiel实现c语言编程,单片机实验1(Kiel-软件的使用和C程序调试)教学文案(18页)-原创力文档...

    单片机原理与接口技术实验 实验一:Kiel 软件的使用和C程序调试一.实验目的: 1.通过实验学会用C语言进行程序的设计. 2.学会应用keil-uvision集成调试软件对C语言程序进行调试.掌握C ...

  9. C# 编程入门第五课,VS2019程序调试,for循环,水仙花数,Console.Write,又一种类型变换,三元表达式,产生随机数

    C# 编程入门第五课 文章目录 C# 编程入门第五课 1. VS2019程序调试 2. for循环 3. 水仙花数 4. Console.Write() 5. 又一种类型变换 6. 三元表达式 7.产 ...

最新文章

  1. 深度学习在超市商品识别中的解决方案分享
  2. android url webview,android - webview获取到当前页面的url
  3. 【Python相关】jupyter平台最强插件没有之一
  4. 破解mysql数据库的密码
  5. RN子组件获取redux数据
  6. 冲浪科技获Ventech China数百万美元天使轮融资,发力自动驾驶行业
  7. (十二)Linux内核驱动之poll和select
  8. 纯javaweb项目整合quarz定时器
  9. 学习MongoDB 六: MongoDB查询(游标操作、游标信息)(三)
  10. ska测试软件怎么用,wow伤害测试软件SIMC怎么用?SIMC使用详细攻略
  11. 深圳大学计算机考研教材,广东-深圳大学计算机考研院校初试科目及参考书汇总...
  12. 在尚硅谷自学Java全栈工程师课程
  13. HikariPool-1 - Connection is not available, request timed out after 6000ms
  14. 计算机里的文案怎么设置背景,如何将图片设置为Word文档的背景
  15. web前端二维码打印模板编辑
  16. CVE PoC的精选列表(二)
  17. 2.1 被隐藏了的过程
  18. AJAX读取Json文件
  19. classnames库的简单使用
  20. 【Web技术】网站留言系统开发,及留言信息实时发送至指定邮箱

热门文章

  1. iphone 字符串
  2. 今天准备正式开博了!专注于Silverlight!
  3. eclipse的菜单栏消失问题解决
  4. QWidget子窗口中setStyleSheet无效,解决方法
  5. 表单界面的兼容PC手机端解决方案
  6. java多线程解决应用挂死的问题
  7. IE内嵌google chrome frame解决浏览器兼容问题
  8. C# Random循环生成随机数重复问题解决方案
  9. JavaScript比较中应使用哪个等于运算符(== vs ===)?
  10. 机电传动控制课程第一周学习笔记