Linux环境下的C/C++基础调试技术

版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及 本声明

http://leyley.blogbus.com/logs/88557715.html


1.调试技术的几个准则

  • 惊喜准则:找到错误是一种惊喜,心理上不要畏惧而是要怀着感恩的心去面对。
  • 从小处开始准则:刚开始测试的使用从小处着手,暂时不涉及边界数据,虽然这样可能会掩盖一些Bug,但是这样或许能查到最主要的Bug,例如你的程序包含了一个巨大的循环体,最容易发现的Bug在第一个循环或第二次循环执行的时候。
  • 自顶向下准则:优先选择step over而不是step into,以节省时间。
  • Segmentation Fault准则:出现段错误时,第一个想到的不应该是printf而是Debugger,因为在调试器中你能看到你的哪一行代码导致了错误,更重要的是你可以通过backtrace等工具得到更多有用的信息。
  • 折半查找准则:在寻找bug时可以充分利用编辑器等工具来进行折半查找,具体在后边有例子说明。



2.Linux下代码调试工具 

主要使用的GDB,以及基于GDB的图形化工具,如DDD或eclipse,选择上看个人习惯了。 命令行式的GDB启动较快,可以在ssh终端下使用,操作简洁,并且在调试GUI程序时不会崩溃,但较之图形化则在单步调试或设置断点时非常不方便。 当然你可以使用Vim等编辑器的插件或者补丁(clewn or vimGDB)来弥补这一缺憾,并且在GDB6.1以上的版本你可以使用GDB -tui这个模式(或者在GDB的命令行模式下按CTRL-x-a)打开一个类似于图形界面的文本界面模式,在这个界面中你可以使用上下键查看源代码(CTRL-P 和 CTRL-N完成输入过的命令的查看). 或者你还可以使用cGDB这个工具(很庆幸这个项目在停止了三年后又有人开始维护了),这个工具是将GDB用curses包装了一下,提供了一些很好用的feature(Esc和i键在代码和命令框间切换;在代码框中支持vim型的操作;在命令框中支持tab键补全命令;在移动到想加入断点的行(行号为高亮白色)直接用空格键,设定好后行号会变红;)。另外,在调试C-S程序时推荐使用eclipse。 在本文中,重点介绍ddd的操作,因为这个工具即结合了GDB命令行和图形界面的操作。其余请参阅各个工具的手册。 3.GDB命令行最基本操作

  • 设置断点:b LineNumber
  • 运行程序:r args1 args2 ...
  • 彻底终止程序:kill
  • 单步执行:n(TIPs1:可以按回车重复上一次操作,在单步调试时这个feature很有用)。
  • 单步进入:s
  • 继续执行:c
  • 设置临时断点:tb LineNumber 可以理解为一次性断点,与断点不同,临时断点只在第一次执行时起作用。
  • 查看变量:p
  • 设置观察点:
    • w Expression,当Expression是一个变量名时,这个变量变化时会停止执行;你也可以使用条件来限定,比如w (z>28),当z大于28时,程序停止。注意观察点一般使用在更大范围上的变量,而不是本地变量,因为在局部变量上设置的观察点在局部结束时(比如该变量所在的函数执行结束时)就被取消了。
    • 当然这并不包含main的情况,因为main函数执行结束后程序就结束了。
  • 查看栈帧:
    • 栈帧指的是在一个函数调用时,该函数调用的运行信息(包含本地变量、参数以及函数被调用的位置)存储的地方。每当一个函数被调用时,一个新的帧就被系统压入一个由系统维护的帧,在这个栈的顶端是现在正在运行的函数信息,当该函数调用结束时被弹出并析构。
    • 在GDB中,frame 0为当前帧,frame 1为当前帧的父帧,frame 2为父帧的父帧,等等,用down命令则是反向的。这是一个很有用的信息,因为在早期的一些帧中的信息可能会给你一些提示。
    • backtrace查看整个帧栈
    • 注意:在帧中来回并不影响程序的执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值