|
Linux调试工具 |
|
|
Linux调试工具
1.使用printf调试
#ifdefDEBUG
Printf(“valriablexhasvalue=%d\n”,x)
#endif
然后在编译选项中加入-DDEBUG
更复杂的调试应用如:
#defineBASIC_DEBUG1
#defineEXTRA_DEBUG2
#defineSUPER_DEBUG4
#if(DEBUG&EXTRA_DEBUG)
printf…
#endif
在这种情况下如果设置编译器标志为-DDEBUG=5,将启用BASIC_DEBUG和SUPER_DEBUG。标志-DDEBUG=0将禁用所有的调试信息,也可以在程序中添加如下语句:
#ifndefDEBUG
#defineDEBUG0
#endif
2.使用gdb调试
Gcc编译的时候要加上-g选项,让编译器在程序中添加额外的调试信息。如果正式发布,这些调试信息可以使用strip命令删除。
Gdb:
Backtrace栈跟踪
3.程序静态分析工具splint
splint功能:
常识性测试并产生一些警告信息。它可以检测未经赋值的变量使用,函数的参数未使用等异常情况。
4.程序执行性能分析工具prof/gprof
显示执行所花费的时间具体都用在什么操作上。
5.内存调试
ElectricFence函数库和valgrind可以用来检查动态内存分配的一些问题,包括内存泄漏。
Linux下的调试工具
随着XP的流行,人们越来越注重软件的前期设计、后期的实现,以及贯穿于其中的测试工作,经过这个过程出来的自然是高质量的软件。甚至有人声称XP会淘汰调试器!这当然是有一定道理的,然而就目前的现实来看,这还是一种理想。在日常工作中,调试工具还是必不可少的。在Linux下,调试工具并非只有gdb,还有很多其它调试工具,它们都各有所长,侧重方面也有所不同。本文介绍几种笔者常用的调试工具:
1.mtrace
在linux下开发应用程序,用C/C++语言的居多。内存泄露和内存越界等内存错误,无疑是其中最头疼的问题之一。glibc为解决内存错误提供了两种方案:
一种是hook内存管理函数。hook内存管理函数后,你可以通过记下内存分配的历史记录,在程序终止时查看是否有内存泄露,这样就可以找出内存泄露的地方了。你也可以通过在所分配内存的首尾写入特殊的标志,在释放内存时检查该标志是否被破坏了,这样就可以达到检查内存越界问题的目的。
另外一种方法更简单,glibc已经为第一种方案提供了默认的实现,你要做的只是在特定的位置调用mtrace/muntrace两个函数,它们的函数原型如下:
#include
voidmtrace(void);
voidmuntrace(void);
你可能会问,在哪里调这两种函数最好?这没有固定的答案,要视具体情况而定。对于小程序来说,在进入main时调用mtrace,在退出main函数时调用muntrace。对于大型软件,这样做可能会记录过多的信息,分析这些记录会比较慢,这时可以在你所怀疑代码的两端调用。
另外,还需要设置一个环境变量MALLOC_TRACE,它是一个文件名,要保证当前用户有权限创建和写入该文件。glibc的内存管理器会把内存分配的历史信息写入到MALLOC_TRACE指定的文件中。
程序运行完毕后,使用mtrace工具分析这些内存分配历史信息,可以查出内存错误的位置(mtrace在glibc-utils软件包里)。
2.strace
在编程时,检查函数的返回值是一种好习惯。对于像glibc等标准C的函数,光检查返回值是不够的,还需要检查errno的值。这样的程序往往显得冗长,不够简洁。同时也可能是出于偷懒的原因,大多数程序里并没有做这样的检查。
这样的程序,一旦出现错误,用调试器一步一步定位错误,然后想法查出错误的原因,也是可以的,不过比较麻烦,对调试器来说有些大材小用,不太可取。这时,用strace命令可能会更方便一点。它可以显示各个系统调用/信号的执行过程和结果。比如文件打开出错,一眼就看出来了,连错误的原因(errno)都知道。
3.binutil
binutil是一系列的工具,你可能根本不知道它们的存在,但是没有它们你却寸步难行。Binutil包括下列工具:
ld-theGNUlinker.
as-theGNUassembler.
addr2line-Convertsaddressesintofilenamesandlinenumbers.
ar-Autilityforcreating,modifyingandextractingfromarchives.
c++filt-FiltertodemangleencodedC++symbols.
gprof-Displaysprofilinginformation.
nlmconv-ConvertsobjectcodeintoanNLM.
nm-Listssymbolsfromobjectfiles.
objcopy-Copysandtranslatesobjectfiles.
objdump-Displaysinformationfromobjectfiles.
ranlib-Generatesanindextothecontentsofanarchive.
readelf-DisplaysinformationfromanyELFformatobjectfile.
size-Liststhesectionsizesofanobjectorarchivefile.
strings-Listsprintablestringsfromfiles.
strip-Discardssymbols.
windres-AcompilerforWindowsresourcefiles.
其中部分工具对调试极有帮助,如:
你可以用objdump反汇编,查看目标文件或可执行文件内部信息。
你可以用addr2line把机器地址转换到代码对应的位置。
你可以用nm查看目标文件或可执行文件中的各种符号。
你可以用gprof分析各个函数的使用情况,找出性能的瓶颈所在(这需要加编译选项)。
4.ld-linux
现在加载ELF可执行文件的工作,已经落到ld-linux.so.2头上了。你可能会问,这与有调试程序有关系吗?有的。比如,在linux中,共享库里所有非static的函数/全局变量都是export的,更糟的是C语言中没有名字空间这个概念,导致函数名极易冲突。在多个共享库中,名字冲突引起的BUG是比较难查的。这时,你可以通过设置LD_DEBUG环境变量,来观察ld-linux.so加载可执行文件的过程,从中可以得到不少帮助信息。LD_DEBUG的取值如下:
libsdisplaylibrarysearchpaths
relocdisplayrelocationprocessing
filesdisplayprogressforinputfile
symbolsdisplaysymboltableprocessing
bindingsdisplayinformationaboutsymbolbinding
versionsdisplayversiondependencies
allallpreviousoptionscombined
statisticsdisplayrelocationstatistics
unuseddeterminedunusedDSOs
helpdisplaythishelpmessageandexit
5.gdb
对于真正意义的调试器来说,gdb在linux下是独一无二的。它有多种包装,有字符界面的,也有图形界面的,有单独运行的,也有集成到IDE中的。gdb功能强大,图形界面的gdb容易上手一点,但功能无疑受到了一些限制,相信大部分高手还是愿意使用字符界面的。Gdb太常用了,这里不再多说。
6.gcc/boundschecker
相信很多人用过win32下的BoundsChecker(Compuware公司)和Purify(IBM公司)两个工具吧。它们的功能实在太强大了,绝非能通过重载内存管理函数就可以做到,它们在编译时插入了自己的调试代码。
gcc也有个扩展,通过在编译时插入调试代码,来实现更强大的检查功能。当然这要求重新编译gcc,你可以到http://sourceforge.NET/projects/boundschecking/下载gcc的补丁。它的可移植性非常好,笔者曾一个ARM平台项目里使用过,效果不错。
7.valgrind
最好的东西往往最后才见到。Valgrind是我的最爱,用习惯了,写的程序不在valgrind下跑一遍,就像没有写单元测试程序一样,有点放心不下。它有BoundsChecker/Purify的功能,而且速度更快。
有点遗憾的是valgrind目前只支持x86平台,当然,这对大多数情况已经足够了。
你可以到http://valgrind.org/下载最新版本。
Linux平台上的C语言调试工具!
DebuggingToolsforConLinuxPlatform
http://www.linuxgazette.com/node/view/8755
SubmittedbyNikhilBhargavaonTue,02/17/2004-14:37.Articles|GeneralInterest
ThisarticletalksaboutdebuggingtoolsforapplicationsinConLinuxplatforms.Mostofthetoolsarefreelyavailableonallmajorplatformswithverywideusersupport.Thetoolshelpinstaticanalysisofcodeaswellasassistindynamicevaluationofcode.
Pleasenotethattoolslistedherearesuggestionsoftheauthor.Thislistisnotastandardone.Changeshavetobedoneinitdependinguponthenature,scopeanddetailsoftheapplicationtobedeveloped.
DebuggingTools
1.Dmallochttp://dmalloc.com/
ThedebugmemoryallocationorDmalloclibraryisafreewaredebuggingtoolwhichhasbeenspeciallydesignedasadropinreplacementforthesystem''smalloc,realloc,calloc,freeandothermemorymanagementroutineswhileprovidingpowerfuldebuggingfacilitiesconfigurableatruntime.Itmakeschangesduringcompiletimeanddonotaddruntimechangesinbinary.Thesefacilitiesincludesuchthingsasmemory-leaktracking,fence-postwritedetection,file/linenumberreporting,andgeneralloggingofstatistics.Thelibraryiswww.baiyuewang.netreasonablyportablehavingbeenrunsuccessfullyonatleastthefollowingoperatingsystems:AIX,BSD/OS,DG/UX,Free/Net/OpenBSD,GNU/Hurd,HPUX,Irix,Linux,MS-DOG,NeXT,OSF,SCO,Solaris,SunOS,Ultrix,Unixware,Windoze,andevenUnicosonaCrayT3E.IthasfullsupportforprogramsthedebuggingofPOSIXthreads.
Thepackageincludesthelibrary,configurationscripts,debugutilityapplication,testprogram,anddocumentation.
2.Valgrindhttp://valgrind.kde.org/
ValgrindisaGPLdistributedsystemfordebuggingandprofilingx86-Linuxprograms.Icanalsobehelpfulforprogramsforplatformsotherthanx86sincebehaviorofx86binaryissimilartootherbinaries.TheaccompanyingtoolswithValgrindautomaticallydetectmanymemorymanagementandthreadingbugs,avoidinghoursoffrustratingbug-hunting,makingprogramsmorestable.Itsupportsathroughdetailedprofilingtohelpspeeduptheprograms.
TheValgrinddistributionincludesfourtools:twomemoryerrordetectors,athreaderrordetector,andacacheprofiler.
3.Electricfencehttp://rpmfind.net/linux/RPM/conecti...-2cl.i386.html
ElectricFenceisafreewarelibrarythatcanbeusedforCprogramminganddebugging.Itcanbelinkedatcompiletimeanditwillwarnaboutpossibleproblemssuchasfreeingmemorythatdoesn''texist,etc.Itisbasicallyamemoryprofilingtool.HowevercurrentlyitisavailableonlyonHP-Unixplatform(Iamnotverysurethough).
4.GDBhttp://sources.redhat.com/gdb
ThisistheGnomeDebuggerwhichcomesasafreewaresupportpackagewithfreewareLinuxdistributionlikeRedHat,Slacware,andDebianetc.IthasfullsupportofmanylanguageslikeC,C++,andPerletc.Ithelpstodebugthebinariesoftheselanguagesinmodeslikesinglestep,multiplesteporcompleterun.Italsohasprovisionsofsettingbreakpointsandtracevalue.
Itishelpfulforstubtesting,functionalflowcheckingandboundchecking.FurtherthisisreadilyavailablewithallflavoursofLinuxandUnixplatformsandisamplysupportedinusercommunity.
5.Insighthttp://sources.redhat.com/insight
InsightisagraphicaluserinterfacetoGDB,theGNUDebuggerwritteninTcl/TkbyatRedHat,Inc.andCygnusSolutionsInsightprovidesallfeaturesprovidedbyGDBalongwithGraphicaldebugginginterfacereplacingtraditionalcommandbasedinterface.
6.Memprofhttp://www.gnome.org/projects/memprof
MemProfisafreewarememoryProfilingandmemoryleakdetectiontoolwhichcomesasanaddendumtocommonLinuxdistributions.Itcangenerateaprofilehowmuchmemorywasallocatedbyeachfunctionintheprogram.Itcanscanmemoryandfindblocksthathavebeenallocatedbutarenolongerreferencedanywhere(deadcode).
MemProfworksbypre-loadingalibrarytooverridetheClibrary''smemoryallocationfunctionsanddoesnotrequirerecompilingtheprogram.Onewww.wang027.comadvantageMemProfhasoversomeothersimilartoolsthatareavailableisthatithasaniceGUIfront-endandisrelativelyeasytouse.
IamNikhilBhargavafromDelhi,India.IamaComputerEngineercurrentlyworkinginC-DOT,Indiaforpastoneyear.CommentsandSuggestionsarealwayswelcome.
10.3图形化调试工具
尽管你可以在大多数(即便不是全部)Linux调试任务中使用GDB,但与长时间坐在GDB命令行前面相比,许多人还是更愿意使用诸如DDD或Eclipse这样的图形化工具。从各方面来看,大多数非常花哨的图形化调试工具不过是建立在GDB基础上的一个抽象,所以选择哪一种图形化工具完全属于个人爱好。
本节将介绍两个这样的工具,当然还存在其他许多这样的工具(包括GDB的前端GNUinsight),它们也被各种开发团队所使用。
从事Linux应用开发一年多了,感觉很不规范很山寨,准备系统地学习一下下linux开发,首先从调试工具的学习开始,以下是从网上看到的一篇linux调试工具介绍,准备好好学习这些工具的使用。
“工欲善其事必先利其器”现在将一些常见的调试工具进行一下总结.
【1】
名称:MEMWATCH
功能:
1、MEMWATCH支持ANSIC
2、它提供结果日志纪录
3、能检测双重释放(double-free)
4、错误释放(erroneousfree)
5、没有释放的内存(unfreedmemory)、
6、溢出和下溢等等。
【2】
名称:YAMD
功能:
1、查找c和c++中动态的、与内存分配有关的问题
【3】
名称:electricfence
功能:
1、检测内存泄露
2、检查数据越界
3、分配受保护的内存
【4】
名称:strace
功能:
1、显示用户空间程序发出的系统调用
2、显示调用的参数和返回值
【5】
名称:gdb
功能:
1、启动程序
2、使程序能够停止在指定文件的指定位置
3、查看程序变量值
4、改变程序执行期间的相关变量、路径等
【6】
名称:Oops
功能:显示系统错误信息
【7】
名称:mtrace
功能:
1、检测一些内存分配和泄漏的失败等
【8】
名称:binutil
说明:binutil为一个工具集合,包含如下的工具。
addr2line把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。
ar建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。
as主要用来编译GNUC编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。
C++filt连接器使用它来过滤C++和Java符号,防止重载函数冲突。
gprof显示程序调用段的各种数据。
ld是连接器,它把一些目标和归档文件结合在一起,重定位数据,并链接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。
nm列出目标文件中的符号。
objcopy把一种目标文件中的内容复制到另一种类型的目标文件中.
objdump显示一个或者更多目标文件的信息。显示一个或者更多目标文件的信息。使用选项来控制其显示的信息。它所显示的信息通常只有编写编译工具的人才感兴趣。
ranlib产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。
readelf显示ebf格式可执行文件的信息。
size列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。
strings打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符,这个程序对于了解非文本文件的内容很有帮助。
strip丢弃目标文件中的全部或者特定符号。
libiberty包含许多GNU程序都会用到的函数,这些程序有:getopt,obstack,strerror,strtol和strtoul.
libbfd二进制文件描述库.
libopcodes用来处理opcodes的库,在生成一些应用程序的时候也会用到它,比如objdump.Opcodes是文本格式可读的处理器操作指令.
功能:程序调试、归档等
【9】
名称:Purify
功能:内存检查工具
【10】
名称:pc-lint
功能:C/C++的静态代码检测工具
【11】
名称:splint
说明:splint是一个动态检查C语言程序安全弱点和编写错误的程序
功能:
1、空引用错误
2、未定义的变量错误
3、类型错误
【12】
名称:boundercheck
功能:检查内存泄露
【13】
名称:valgrind
功能:
1、检查内存错误
IDA最知名的是反汇编器,它是二进制文件执行静态分析的最佳工具之一。由于现代反静态分析技术的复杂性,人们常常将静态分析与动态分析技术结合起来,以利用二者的优势。理想情况下,所有这些工具集成在一个软件包中。Hex-Rays在推出4.5版的IDA调试器时,做出巩固IDA的作用将其作为一个通用的逆向工程工具这一举动。随着IDA的后续版本,调试功能得到改善。在最新版本中,IDA能够在多个不同的平台上进行本地和远程调试,并支持多种不同的处理器。
Linux调试工具lsof的深入分析
DDD,全称是DataDisplayDebugger,对于Linux系统中的编程人员来说,它就是windows系统下面的visualstudio,功能强大,数Linux世界中少数有图形界面的程序调试工具
4、内存检查
|
|
|
|
|
|
|
|
|
|
|