20161108
来源:互联网 发布:水写布练字好吗知乎 编辑:程序博客网 时间:2024/06/06 15:54
随着XP的流行,人们越来越注重软件的前期设计、后期的实现,以及贯穿于其中的测试工作,经过这个过程出来的自然是高质量的软件。甚至有人声称XP会淘汰调试器!这当然是有一定道理的,然而就目前的现实来看,这还是一种理想。在日常工作中,调试工具还是必不可少的。在Linux下,调试工具并非只有gdb,还有很多其它调试工具,它们都各有所长,侧重方面也有所不同。本文介绍几种笔者常用的调试工具:
1. mtrace
在linux下开发应用程序,用C/C++语言的居多。内存泄露和内存越界等内存错误,无疑是其中最头疼的问题之一。glibc为解决内存错误提供了两种方案:
一种是hook内存管理函数。hook内存管理函数后,你可以通过记下内存分配的历史记录,在程序终止时查看是否有内存泄露,这样就可以找出内存泄露的地方了。你也可以通过在所分配内存的首尾写入特殊的标志,在释放内存时检查该标志是否被破坏了,这样就可以达到检查内存越界问题的目的。
另外一种方法更简单,glibc已经为第一种方案提供了默认的实现,你要做的只是在特定的位置调用mtrace/muntrace两个函数,它们的函数原型如下:
#include <mcheck.h>
void mtrace(void);
void muntrace(void);
你可能会问,在哪里调这两种函数最好?这没有固定的答案,要视具体情况而定。对于小程序来说,在进入main时调用mtrace,在退出main函数时调用muntrace。对于大型软件,这样做可能会记录过多的信息,分析这些记录会比较慢,这时可以在你所怀疑代码的两端调用。
另外,还需要设置一个环境变量MALLOC_TRACE,它是一个文件名,要保证当前用户有权限创建和写入该文件。glibc的内存管理器会把内存分配的历史信息写入到MALLOC_TRACE指定的文件中。
程序运行完毕后,使用mtrace工具分析这些内存分配历史信息,可以查出内存错误的位置(mtrace在glibc-utils软件包里)。
2. strace
在编程时,检查函数的返回值是一种好习惯。对于像glibc等标准C的函数,光检查返回值是不够的,还需要检查errno的值。这样的程序往往显得冗长,不够简洁。同时也可能是出于偷懒的原因,大多数程序里并没有做这样的检查。
这样的程序,一旦出现错误,用调试器一步一步定位错误,然后想法查出错误的原因,也是可以的,不过比较麻烦,对调试器来说有些大材小用,不太可取。这时,用strace命令可能会更方便一点。它可以显示各个系统调用/信号的执行过程和结果。比如文件打开出错,一眼就看出来了,连错误的原因(errno)都知道。
- 20161108
- 20161108随笔
- 20161108学习心得
- 20161108Hbase-Coprocessor
- 【Java每日一题】20161108
- android developer tiny share-20161108
- ios developer tiny share-20161108
- [李景山php]每天laravel-20161108|ShareErrorsFromSession.php
- 20161108的考试】脑洞题,水题,模拟
- 20161108 Python 读书笔记之超级模块
- [20161108]校招面试题被虐经历总结
- 学习注水-20161108-Perl: Can't locate XML:LibXML
- 踩坑系列-20161108-神坑之virtualbox不能改vt-x
- Object-Oriented Analysis and Design Using UML 翻译与学习 (十)
- 397_压缩图片到一定大小(质量)
- 【NDN实验】ndnSIM 2.0: A new version of the NDN simulator for NS-3 全文翻译
- 支付宝移动支付集成
- HTML--javascript的日期变量
- 20161108
- Spark2.0 监控界面报错javax.servlet.http.HttpServletRequest.isAsyncStarted()Z
- 算法-求最大公约数
- 随机数的产生
- 吉布斯采样(Gibbs Sampling)及相关算法
- [libgdx游戏开发教程]使用Libgdx进行游戏开发(3)-给游戏添加一些控制功能
- solr 4.2 使用插件链来完善、简化增量index逻辑
- EasyRoads3D使用教程
- 小程序公测后,你可以关注这些