Linux下的调试工具

Linux下的调试工具

 

随着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工具分析这些内存分配历史信息,可以查出内存错误的位置(mtraceglibc-utils软件包里)

 

2.         strace

在编程时,检查函数的返回值是一种好习惯。对于像glibc等标准C的函数,光检查返回值是不够的,还需要检查errno的值。这样的程序往往显得冗长,不够简洁。同时也可能是出于偷懒的原因,大多数程序里并没有做这样的检查。

 

这样的程序,一旦出现错误,用调试器一步一步定位错误,然后想法查出错误的原因,也是可以的,不过比较麻烦,对调试器来说有些大材小用,不太可取。这时,用strace命令可能会更方便一点。它可以显示各个系统调用/信号的执行过程和结果。比如文件打开出错,一眼就看出来了,连错误的原因(errno)都知道。

 

3.         binutil

binutil是一系列的工具,你可能根本不知道它们的存在,但是没有它们你却寸步难行。Binutil包括下列工具:

  • ld - the GNU linker.
  • as - the GNU assembler.
  • addr2line - Converts addresses into filenames and line numbers.
  • ar - A utility for creating, modifying and extracting from archives.
  • c++filt - Filter to demangle encoded C++ symbols.
  • gprof - Displays profiling information.
  • nlmconv - Converts object code into an NLM.
  • nm - Lists symbols from object files.
  • objcopy - Copys and translates object files.
  • objdump - Displays information from object files.
  • ranlib - Generates an index to the contents of an archive.
  • readelf - Displays information from any ELF format object file.
  • size - Lists the section sizes of an object or archive file.
  • strings - Lists printable strings from files.
  • strip - Discards symbols.
  • windres - A compiler for Windows resource files.

其中部分工具对调试极有帮助,如:

你可以用objdump反汇编,查看目标文件或可执行文件内部信息。

你可以用addr2line把机器地址转换到代码对应的位置。

你可以用nm查看目标文件或可执行文件中的各种符号。

       你可以用gprof分析各个函数的使用情况,找出性能的瓶颈所在(这需要加编译选项)

 

4.         ld-linux

现在加载ELF可执行文件的工作,已经落到ld-linux.so.2头上了。你可能会问,这与有调试程序有关系吗?有的。比如,在linux中,共享库里所有非static的函数/全局变量都是export的,更糟的是C语言中没有名字空间这个概念,导致函数名极易冲突。在多个共享库中,名字冲突引起的BUG是比较难查的。这时,你可以通过设置LD_ DEBUG环境变量,来观察ld-linux.so加载可执行文件的过程,从中可以得到不少帮助信息。LD_ DEBUG的取值如下:

  • libs        display library search paths
  • reloc       display relocation processing
  • files       display progress for input file
  • symbols     display symbol table processing
  • bindings    display information about symbol binding
  • versions    display version dependencies
  • all         all previous options combined
  • statistics  display relocation statistics
  • unused      determined unused DSOs
  • help        display this help message and exit

5.         gdb

对于真正意义的调试器来说,gdblinux下是独一无二的。它有多种包装,有字符界面的,也有图形界面的,有单独运行的,也有集成到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/ 下载最新版本。

 

 

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Linux下的串口调试工具是一种用于调试和检测串口相关问题的软件。它能够通过串口与外部设备进行通信并获取数据,还可以对串口参数进行设置和调试。常用的串口调试工具有Minicom、PuTTY、GTKterm等。 ### 回答2: 在Linux环境下,串口调试工具十分重要,可以用于连接嵌入式系统、控制硬件设备、调试串口通信等。Linux系统自带了几种常用的串口调试工具,下面简单介绍一下。 1. minicom minicom是一个十分流行的Linux终端程序,它可以帮助你在命令行中调试串口。它具有设置波特率、数据位、停止位、校验位、流控制等功能,可以很方便地对串口通信进行调试。 安装方法: sudo apt-get install minicom 接下来,你需要用以下命令打开minicom: sudo minicom –s 进入参数配置界面,依次进行波特率、数据位、停止位、校验位的设置。最后保存配置,退出minicom。接着用下面的命令来打开minicom: sudo minicom 2. screen screen是一个Linux下的终端多路复用程序,可以同时与多个串口通信。和minicom不同,screen并没有提供与串口的交互界面,而是将串口数据直接输出到终端上。它具有流控制、屏幕滚动、回显等功能。 安装方法: sudo apt-get install screen 与minicom类似,接下来需要用以下命令来打开screen: sudo screen /dev/ttyS0 3. gtkterm gtkterm是一个基于GTK的终端程序,它支持串口调试和网络调试。它具有设置串口参数、发送数据、接收数据、自动滚动等功能。同时还支持自定义波形图、绘制曲线等高级功能。不过,它的界面相对比较复杂,需要打开很多选项。 安装方法: sudo apt-get install gtkterm 接下来用以下命令打开gtkterm: sudo gtkterm 总结:以上三种Linux下的串口调试工具都具有各自的特点和优点,个人认为minicom功能最为简单实用,而screen的多路复用功能比较强大,gtkterm则适合高级用户。根据个人需求选择合适的串口调试工具即可。 ### 回答3: 串口调试工具是在Linux操作系统下进行串口调试和数据通信的一个工具。在Linux系统中,串口调试工具一般通过命令行的方式进行使用,可以实现基本的串口读和写操作,以便调试特定的硬件设备。 对于Linux系统用户来说,常见的串口调试工具有minicom和cu。其中,minicom是一个功能齐全的串口调试工具,用户可以通过它来设置串口参数、发送和接收数据等。cu则是一个较为简单的串口调试工具,但同样支持基本的串口读和写操作。 此外,有许多其他串口调试工具可以用于Linux系统。例如,gtkterm和cutecom等图形用户界面(GUI)工具,可以更方便地对串口进行调试。对于需要在多台设备之间进行数据通信的用户,也可以使用socat或者ttyshare等工具,以达到类似于网络中继的效果。 需要注意的是,在使用Linux下的串口调试工具时,用户需要使用root权限来访问串口设备文件。此外,根据不同的硬件设备类型和传输协议,用户可能还需要进行额外的配置和设置,以确保测试和通信工作正常。 总之,Linux下的串口调试工具可以帮助用户在调试和开发硬件设备时更快、更准确地获取到相关数据,并可根据需要对数据进行处理和分析。选择合适的串口调试工具可以极大地提高工作效率和设备性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值