没有合适的资源?快使用搜索试试~ 我知道了~
linux下调试技术,几乎涵盖了平时所有能用到的调试方法及其工具
资源推荐
资源详情
资源评论
1. 调试利器 gdb
1.1. 调试意义
搞电子都知道,电路不是焊接出来的,是调试出来的。程序员也一定认同,
程序不是写出来的,是调试出来的。那么调试工具就显得尤为重要,linux 作为
笔者重要的开发平台,在 linux 中讨论调试工具主要是为那些入门者提供一些帮
助。调试工具能让我们能够监测、控制和纠正正在运行的程序。我们在运行一些
程序的时候,可能被卡住或出现错误,或者运行过程或结果,没能如我们预期,
此时,最迫切需要明白究竟发生了什么。为了修复程序,剖析和了解程序运行的
细节, 调试工具就成为了我们的必备工具,工于善其事,必先利其器。
1.2. 命令参数
描述
backtrace(或 bt)
查看各级函数调用及参数
finish
连续运行到当前函数返回为止,然后停下来等待命令
frame(或 f)帧编
号
选择栈帧
info(或 i) locals
查看当前栈帧局部变量的值
list(或 l)
列出源代码,接着上次的位置往下列,每次列 10 行
list 行号
列出从第几行开始的源代码
list 函数名
列出某个函数的源代码
next(或 n)
执行下一行语句
print(或 p)
打印表达式的值,通过表达式可以修改变量的值或者
调用函数
描述
quit(或 q)
退出 gdb 调试环境
set var
修改变量的值
start
开始执行程序,停在 main 函数第一行语句前面等待
命令
step(或 s)
执行下一行语句,如果有函数调用则进入到函数中
比如还有几个命令如下:
wath 观察一个变量
current 跳转到下个断点,或则跳转到观察点
quit 退出 gdb 调试
1.3. 基本使用
如果一个进程已经在运行,你需要将 GDB 连接到它上面,可以通过指定进
程 ID 来实现。假设程序已经崩溃,要分析问题的原因,则用 GDB 分析 core 文
件。
1.3.1.启动程序
一旦你在 GDB 里面,使用'run'命令来启动程序进行调试。
1.3.2.给程序传参数
使用'set args'给你的程序传参数,当程序下次运行时将获得该参数。'show
args'将显示传递给程序的参数。
1.3.3.检查堆栈
每当程序停止,任何人想明白的第一件事就是它为什么停止,以及怎么停在
那里的。该信息被称为反向跟踪。由程序产生每个函数调用和局部变量,传递的
参数,调用位置等信息一起存储在堆栈内的数据块中,被称为一帧。我们可以使
用 GDB 来检查所有这些数据。 GDB 从最底层的帧开始给这些帧编号。
�bt: 打印整个堆栈的回溯
�bt 打印 n 个帧的回溯
�frame : 切换到指定的帧,并打印该帧
�up : 上移'n'个帧
�down : 下移'n'个帧 ( n 默认是 1)
1.3.4.检查数据
程序的数据可以在里面 GDB 使用'print'命令进行检查。例如,如果'x'是调
试程序内的变量,'print x'会打印 x 的值。
1.3.5.检查源码
源码可以在 GDB 中打印。默认情况下,'list'命令会打印 10 行代码。
�list : 列出'linenum'行周围的源码
�list : 从'function'开始列出源码
�disas : 显示该函数机器代码
1.3.6.停止和恢复程序
使用 GDB,我们可以在必要的地方设置断点,观察点等来停止程序。
�break : 在'location'设置一个断点。当在程序执行到这里时断点将被击
中,控制权被交给用户。
�watch : 当'expr'被程序写入而且它的值发生变化时 GDB 将停止
�catch : 当'event'发生时 GDB 停止
�disable : 禁用指定断点
�enable : 启用指定断点
�delete : 删除 断点/观察点/捕获点。 如果没有传递参数默认操作是在所
有的断点
�step: 一步一步执行程序
�continue: 继续执行程序,直到执行完毕
1.3.7.退出 GDB
用'quit'命令还从 GDB 中退出。
GDB 还有更多的可用选项。里面 GDB 使用 help 选项了解更多详情。
1.4. 普通命令
1.4.1.list 命令
list linenum 显示程序第 linenum 行周围的程序
list function 显示函数名为 function 的函数的源程序
list 显示当前行后面的源程序
list - 显示当前行前面的源程序
1.4.2.run(r)
运行命令。
�run args run 命令可以直接接命令行参数值,也可以在执行 run 之
前通过 set args + 参数值实现。
1.4.3.break(b)
打断点,使用方法:
�b linenum 在某行打断点
�b +offset/-offset 在当前行号的前面或后面 offset 停住
�b filename:linenum 在某文件的某行打断点
�b filename:function 在某文件某个函数入口停住
�b *address 在程序的运行地址处停住
�b 没有参数在下一句停住
�b where if condition 当某个条件满足时,在某一行停住(这个很
有用,比如 b 10 if (ret == 5)
对于 break 命令,我们要灵活使用。例如打多个断点。多线程程序中我们可
以主函数中线程创建后立即打断点,执行线程函数入口打断点等。
关闭断点:delete(d) breakpoint-id
设置断点的条件方式如下:
设置断点的时候加入条件
break foo if value_a > value_b
用 condition 命令
condition bnum expression
例如: condition 6 if value_a == 10
如果你设置的断点条件,无效会提示:(这于断点的上下文有关,关于断点
的上下文会子专门章节阐述)
No symbol "foo" in current context
取消断点条件
condition bnum
断点条件特殊用法
剩余89页未读,继续阅读
资源评论
u010787096
- 粉丝: 128
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- 【ERP标准流程-标准流程-进货管理】(DOC 17页).doc
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- Java爬虫项目【项目开发计划】(共12页).docx
- 11111111111
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功