gdb 调试学习
gdb 是unix/linux 系统下的程序调试工具,和IDE(如VS, Eclipse等)的图形化调试工具相比,gdb在断点,跟踪显示方面有着不足,但是它在某些方面比图形化调试工具更加丰富的功能。
gdb 调试前提
如果希望程序能够被gdb调试,则需要在编译程序时候,指定 -g 选项。 gdb 的调试和程序的release 优化一样,也存在着级别,可以手动设置。默认的gdb级别为2, 当把gdb的调试级别设置为3的时候,可以在gdb调试过程中 macro expand/exp 对程序中的宏定义进行展开。
gdb 调试的图形化工具
gdb本身不带图形化界面,这样在调试中难以方便的知道程序当前的上下文。为了克服这一弱点,gdb也增加了一些图形化的工具集,如 gdb -tui。使用 $ gdb -tui 程序名 可以进入gdb的图形化调试状态。或者执行 $ gdb 程序名 进入命令行调试,然后执行 ctrl + x + A 开启 tui 模式,ctrl + x + A 关闭tui模式。
gdb 调试的常用指令
调试前的准备
1. 设置运行参数
set args 可设置运行时参数, set args -ip "192.168.0.1" -port 6555
show args 可以显示运行时参数
2. 运行环境
path 可设定程序的运行路径
show paths 显示程序的运行路径
set environment varname = value 可以设置环境变量
show environment varname 可以显示环境变量
3.工作目录
cd 相当于shell的cd
pwd 显示当前所在的目录
4. 程序的输入输出
info terminal 显示程序用到的终端的模式
使用重定向控制程序的输出,如 r (run) > outfile
常用命令
| GDB常用命令 | 格式 | 含义 | 简写 |
| list | List [开始,结束] | 列出文件的代码清单 | l |
| prit | Print 变量名 | 打印变量内容 | p |
| break | Break [行号或函数名] | 设置断点 | b |
| continue | Continue [开始,结束] | 继续运行 | c |
| finish | finish | 继续运行直到程序结束 | |
| info | Info 变量名 | 列出信息 | i |
| next | Next | 下一行 | n |
| step | Step | 进入函数(步入) | s |
| until | until 行号 | 运行到指定的行 | u |
| display | Display 变量名/ 表达式 | 显示参数或者表达式的值 | |
| file | File 文件名(可以是绝对路径和相对路径) | 加载文件 | |
| run | Run args | 运行程序 | r |
| enable | enable b (num) / display (num) | 使 断点/显示 有效 | |
| disable | disable b (num)/ display (num) | 使断点/显示 无效 | |
| clear | clearn filename:linenumber(filename为空表示当前文件) | 删除设置在特定源文件、特定行上的断点。 | |
| backtrace | bt | 查看函数调用的栈帧 | bt |
| 回车 | 重复上一条命令 |
info break 显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
info local 显示当函数中的局部变量信息。
info prog 显示被调试程序的执行状态。
info var 显示所有的全局和静态变量名称。
kill 终止正被调试的程序。
l(list) filename: line_number 用来显示指定文件的行
断点
b (break) 行号 在指定行添加断点
b(break) 函数名 在制定函数前添加断点
b(break) filename:行号 在指定文件的指定行之前添加断点
b(break) filename:函数名 在指定文件的指定函数前添加断点
b(break) *address 在程序运行到指定的内存地址处停止
b(break) ... if ... 条件断点, 如 break 337 if i == 0
info b 列出所有的断点信息
d 删除所有的断点, d number 删除number号断点
condition break-num conds 当在conds条件满足时,break-num被触发。可以用来设置或者修改断点的条件。
condition break-num 使break-num的断点无条件。
观察点
watch 一旦表达式值有变化,马上停止程序
rwatch 当表达式/变量被读时,停止程序
awatch 当表达式/变量 被读或写时,停止程序
info watchpoints 列出所有的观察点
观察点删除,使用 d 观察点的序号(info b 可以列出所有断点 + 观察点 + 的情况)
为停止点设置运行命令(实用功能)
commands [break-num]
...command list....
end
为断点 break-num 指定一个命令列表,当在停止点处停止时,gdb依次执行列表中的命令
调试子进程
1. set-follow-fork-mode
gdb 中 可以设置对使用fork/vfork的方式产生子进程的程序进行多进程调试。
set-follow-fork-mode parent 在fork/vfork之后继续对父进程进行调试
set-follow-fork-mode child 在fork/vfork之后继续对子进程进行调试
(gdb) set follow-fork-mode child
(gdb) break 子进程行号
2. attach (gdb在调试一个进程的时候,使用attach 另一个进程的PID, 调试另一个进程,调试完之后,detach 释放另一个进程,继续调试本进程)
attach 命令可以绑定一个外部程序进行调试,attach 进程的PID
假设要调试进程 proc1 的子进程,使用 ps -ef |grep proc1 找出子进程的PID, 然后 (gdb) attach 子进程PID 即可。
调试完之后,使用detach PID释放子进程,继续对父进程进行调试。
自定义调试节奏
gdb 可以自定义命令来简化方便调试过程,命令定义在文件 .gdbinit 文件中,格式为:
define <command>
<code>
end
document <command>
<help text>
end
查看宏定义
首先在编译时加入参数 ‘-gdwarf-2’ ‘-g3’ :
$ gcc -gdwarf-2 -g3 sample.c -o sample
用于通知gcc编译器在编译时加入扩展信息.
* info macro <macro name> : 显示宏的信息
* macro expand expression : 展开表达式expression. 但是不会显示表达式结果.
假设有定义 #define ADD(x,y) (x)+(y) 那么
(gdb) macro expand ADD(7,8)
expands to: (7)+(8)
gdb tui 模式的常用选项
执行gdb -tui 程序名,自动进入tui模式的 layout src 模式,即 窗口上方显示程序源码,下方为命令窗口。
layout src 默认模式,上方为程序源码,下方为命令窗口
layout asm 上方显示程序的汇编代码,下方为命令窗口
layout split 三个窗口,上方为src, 中间为 asm,下方为cmd
layout reg 在最上方(src 的上方或asm的上方)显示寄存器窗口
tui reg general 显示通用寄存器
tui reg float 显示浮点寄存器
tui reg system 显示系统寄存器
tui reg next 显示寄存器的下一页
focus src/asm/cmd/reg 将光标切换到指定窗口
refresh 刷新所有窗口
update 更新源代码窗口和当前执行点
winheight name +/- line 调整name窗口的高度
gdb 调试core dump
程序可能会出现随机性的运行时崩溃,这种崩溃一般很难重现。可以使用core dump文件来调试这种问题。core dump文件是程序在发生崩溃的时候系统所产生的记录文件。
ulimit -c 查看系统设置的core 文件大小限制,ulimit -c size 设置系统设置的core 文件的大小,如 ulimit -c unlimited 设置大小无限制 // 设置只对当前shell有效
debug版的程序在运行时出错,生成core文件后。使用gdb 对core文件进行调试,可以调试随机性的错误。
$ gdb 程序名 core文件
启动之后,就和正常gdb一样调试。
gdb 调试学习的更多相关文章
- GDB调试总结__1
该博客旨在分享IT技术心得和实际工作中遇到问题的解决方法,下面是新浪博客地址http://blog.sina.com.cn/qianyumolu,则为分享经济.行业趋势.心灵文章等,有兴趣的朋友能够踩 ...
- gdb调试汇编堆栈过程的学习
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...
- linux学习之四---gdb调试
在Linux应用程序开发中,最经常使用的调试器是gdb. 一.启动和退出gdb gdb调试的对象是可运行文件,而不是程序的源码.假设要使一个可运行文件能够被gdb调试,那么使用编译器gcc编译时须要增 ...
- Linux学习--gdb调试
一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...
- GDB调试汇编栈堆过程的学习
前期调试 我的程序代码是: 首先,用gcc g gdb.c -o gdb -m32产生32位汇编. 输入gdb gdb进入gdb调试器 在main函数处设置一个断点:b main 用disassemb ...
- Nginx学习之十四-GDB调试Nginx初试
本文的测试环境: Win7+虚拟机VMWareVMware-workstation-full-7.1.4-385536+Ubuntu12.04 Nginx-1.4.0 要想有效的研究Nginx源码,必 ...
- Linux学习----gdb调试(指针的指针)
昨天遇到一个很奇怪的问题,如下: 按照理论,最后*p的值应该是99,不知为什么是15了,所以今天记录用gdb调试的过程,并熟悉gdb的使用. (调试过程参考:http://www.cnblogs.co ...
- Golang源码学习:使用gdb调试探究Golang函数调用栈结构
本文所使用的golang为1.14,gdb为8.1. 一直以来对于函数调用都仅限于函数调用栈这个概念上,但对于其中的详细结构却了解不多.所以用gdb调试一个简单的例子,一探究竟. 函数调用栈的结构(以 ...
- GDB调试汇编分析
GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdb ...
随机推荐
- CSUFT 1005 Coffin Tiles
1005: Coffin Tiles Time Limit: 1 Sec Memory Limit: 128 MB Submit: 2 Solved: 2 Description ...
- easyUI单元格合并自定义封装
1.指定列的行合并 * 效果图: 合并自定义封装(一) * 程序: function mergeGridColCells(grid,rowFildName) { var rows=grid.dat ...
- 用户名 不在 sudoers文件中,此事将被报告。(转)
话说昨天新建了一个帐号linc,今天在执行sudo时回显一个很吓人的信息: [sudo] password for linc: linc 不在 sudoers 文件中.此事将被报告. 这是要去哪儿报告 ...
- 达人眼中的WINCE网络驱动
实际上在WinCE上开发网络驱动,比如设计一个NIC驱动, 大多数情况,是从XP移植NDIS Miniport驱动(小端口驱动)到WinCE.什么是ndis?Ndis做什么用的? 什么是minipor ...
- HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用?
X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的.通过在meta中设置X-UA-Compatible的值,可以指定网页的兼容性模式设置. 在网页中指定的模式优 ...
- linux系统:rm-rf执行以后,怎么办?我来教你恢复文件。
记得我当时也犯过这个错误 rm -rf /* 傻傻的盯着屏幕看... 还好当时是在自己的虚拟机里,没什么数据,打镜像恢复回来就好了.今天看到这篇文章,备用!嗯 是的 万一哪天脑抽了 --------- ...
- CG基础教程-陈惟老师十二讲笔记
转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...
- 手机页面中的meta标签
以前看书的时候,觉得meta标签就只有一个charset对于我来说是有用的.前段时间有个学弟让我写个手机版的网页,我才知道原来meta标签有那么多学问. meta指元素可提供有关页面的元信息(meta ...
- Oracle VM VirtualBox 虚拟机与主机共享文件
安装增强功能(参考文档) VirtualBox自带了一个增强工具Sun VirtualBox Guest Additions,这是实现虚拟机与真实主机共享的关键.启动虚拟机后,点击控制菜单“设备”→“ ...
- Iframe刷新父窗口的几种方式
/*Iframe刷新父窗口的几种方式在iframe的子页面中,使用onload刷新父页面的时候,遇到了一些问题. 1.目前来说,测试成功,并且兼容IE6/7和FF的刷新方式. */ <scrip ...