博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDB 、 LINUX 下 GDB 调试 小结---->基础知识!
阅读量:4053 次
发布时间:2019-05-25

本文共 2234 字,大约阅读时间需要 7 分钟。

//!> 注意:binary 是 gdb_
//!> 注意:()里面也是可以的 
 
 
//!> 应用最频繁的 
 
 
0. 
 
 
 
 
 
-g 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!>编译加上-g可以将代码编入,否则有些指令无效 
 
 
1.  
 
 
 
 
 
file  
 
 
gdb_ 
 
 
 
 
 
 
 
 
//!> 将binary导入
2. 
 
 
 
 
 
l( list ) 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 显示代码段
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 注意前提是将代码编译进去,也就是编译是加上-g
3. 
 
 
 
 
 
r( run ) 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> run
4. 
 
 
 
 
 
c( continue ) 
 
 
 
 
 
 
 
//!> 继续run直到下一个断点处
5. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 增加断点,后面参数是行数就可以了
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 参数也可以是函数名称( 设置在第一个执行代码行处 )
6. 
 
 
 
 
 
info break 
 
 
 
 
 
 
 
 
 
 
//!> 显示当前的断点信息 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7. 
 
 
 
 
 
s( next ) 
 
 
 
 
 
 
 
 
 
 
 
 
//!>从当前位置单步执行
8. 
 
 
 
 
 
p( print ) 
 
 
 
 
 
 
 
 
 
//!>显示n当前的值
9. 
 
 
 
 
 
bt 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 查看函数堆栈
10. 
 
 
 
 
 
finish 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 退出函数
11. 
 
 
 
 
 
help 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 注意第一次显示的仅仅是命令种类,要细察还要接着对每项
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 查询 
 
 
 
 
 
12. 
 
 
 
 
 
set args XXXXXX 
 
 
... 
 
 
//!> 当函数代参执行即run之前可以写入参数
13. 
 
 
 
 
 
show args 
 
 
 
 
 
 
 
 
 
//!> 显示参数
14. 
 
 
 
 
 
q( quit ) 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 退出
15. 
 
 
 
 
 
cd 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!>与shell的cd是一样的
16. 
 
 
 
 
 
pwd 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 显示当前工作目录
17. 
 
 
 
 
 
u( until ) 
 
 
 
 
 
 
 
 
 
 
 
//!> 单步时跳过一个循环体
18. 
 
 
 
 
 
si或ni 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 单步跟踪机器指令!!!
>: 
 
 
修改变量值和命名问题
 
 
 
>: print x =9 
 
 
 
 
 
 
 
 
 
 
 
 
 
//!> 修改x的值为9
 
 
 
>: if 某个变量与GDB的命令重名,我们要使用var
 
 
 
 
 
例如:有一个width变量,现在设置值
 
 
 
 
 
一般 set width= 47就好,但是不对,
 
 
 
 
 
但是setwidth是GDB命令,所以报错,
 
 
 
 
 
此时处理:set varwidth = 47就可以!
>: 
 
 
跳转执行:GDB 可以修改程序的执行顺序
 
 
 
jump<line>:跳到某行
 
 
 
jump<addr>:跳到addr地址处
 
 
 
>: 
 
 
强制函数返回
 
 
 
如果你的调试断点在某个函数中,并还有语句没有执行完。你可以使用 return命令强制函
 
 
 
数忽略还没有执行的语句并返回。
 
 
 
return
 
 
 
return<exp>
 
 
 
>: 
 
 
强制调用函数
 
 
 
call<exp>
 
 
 
>:  
 
 
暂停/恢复程序运行
 
 
 
>: 暂停:
 
 
 
断点(breakpoint):前面说过
 
 
 
观 察点(watchpoint)
 
 
 
捕捉点(catchpoint)
 
 
 
信 号 (signals)
 
 
 
线程停止(threadstops)
 
 
 
 
 
 
>: 恢复:
 
 
 
如果要恢复程序运行,可以使用 c 或者 continue 命令。
 
 
 
也可以用s( step)或者n( next )执行单步!
 
 
 
>:  
 
 
运行环境:
 
 
 
path<dir>:可以自己设置程序运行路径
 
 
 
showpaths:查看运行路径
 
 
 
setenvironment( env ) varname[=value]:设置环境变量,例如:set envUSER=hchen
 
 
 
showenvironment( env ) [varname]:查看环境变量,例如:show env USER
>: 
 
 
程序的输入输出
 
 
 
infoterminal 显示程序用到的终端的模式使用重定向空值程序输出。如 run>outfile
 
 
 
tty命令可以指定写输入输出的终端设备。如 tty /dev/ttyb
>: 
 
 
启动 GDB 的方法有以下几种:
 
 
 
1、 gdb<program>
 
 
 
 
 
 
program 也就是你的执行文件,一般在当前目录下。
 
 
 
2、 gdb<program> core
 
 
 
 
 
 
用 gdb 同时调试一个运行程序和 core 文件,core 是程序非法执行后 core dump后
 
 
 
 
 
 
产生的文件。
 
 
 
3、 gdb<program><PID>
 
 
 
 
 
 
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程 ID。gdb
 
 
 
 
 
 
会自动 attach 上去,并调试它。program 应该在 PATH环境变量中搜索到。
>: 
 
 
注意:
 
 
 
 
 
 
敲入 命令第一个字母, 按两次 TAB 键,你会看到所有 此字母 开头的命令:
>:  
 
 
当我们需要某个函数增加断点时候,但是不知道函数的全拼,只知道前面几个字母,那么
 
 
 
就可以执行:b 
fu<TAB><TAB>就可以查看到了( 此处以fn开头的函数 )
>: 
 
 
当然在GDB中也可以运行shell命令:shell<cmd>
>: 
 
 
可以在GDB中make重新编译改过的代码!:make<-args>
>: 
 
 
关于list指令
 
 
 
list:显示当前行后面的源程序
 
 
 
list-:显示当前行前面的源程序
 
 
 
list<line>:显示第几行的源程序
 
 
 
list<fun>:显示函数fun的源程序
 
 
 
>: 
 
 
十、 查看寄存器
 
 
 
要查看寄存器的值,很简单,可以使用如下命令:
 
 
 
inforegisters:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
查看寄存器的情况(除了浮点寄存器)。
 
 
 
infoall-registers:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
查看所有寄存器的情况(包括浮点寄存器)。
 
 
 
inforegisters<regname...>:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
查看所有指定的寄存器的情况。
 
 
 
寄存器中放置了程序运行时的数据,比如程序当前运行的指令地址(ip),程序的当前堆栈地址
 
 
 
(sp)等等。你同样可以使用 print命令来访问寄存器的情况,只需要在寄存器名字前加一个
 
 
 
$符号就可以来看。如:p$eip。
 
 
 

转载地址:http://wmaci.baihongyu.com/

你可能感兴趣的文章
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret&nbsp;1.1&nbsp;正在审核中
查看>>
IOS开发的开源库
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb 命令
查看>>
MongoDB基本使用
查看>>