gdb调试
来源:互联网 发布:alpine linux 添加源 编辑:程序博客网 时间:2024/05/29 06:44
一、程序编译
gdb是Linux下的一个调试工具。使用gdb调试程序,首先必须在用gcc编译源码时加上-g选项,将程序源码信息加入可执行文件(这并不意味着调试过程中不需要源码文件了,如果源码文件不在编译时的路径,以编译时的文件名存在,调试中会找不到文件)。在调试过程中可通过list命令查看程序对应的源码。
二、进入gdb
可通过两种途径进入gdb:
其一,输入gdb命令回车,然后使用file命令加载想要调试的程序;
其二,直接使用 gdb 可执行程序名;
三、gdb常用命令
1、指定程序入参: set args argv1 argv2 ...
也可以通过run 命令运行时指定,如: run argv1 argv2 ...
2、list(或 l)命令查看源码
list 开始行号 // 输出自指定行开始10行源码(默认输出10行)
list 开始行号,结束行号 //指定行区间内源码
list 函数名
list - // 显示当前位置前10行源码
3、break 设置断点
1)无条件断点:程序运行到达断点即会中断。
b 函数名
b 行号
b 文件名:行号
b 文件名:函数名
b +偏移量 // 没有实际操作过
b -偏移量
b *地址
2)查询已设置的断点信息
info break(或 i b)
3)条件断点:条件为真时中断。
b 断点 if 条件 // 新设置
b 断点编号 条件 // 已经存在的断点仅在条件满足时终端
condition 断点编号 //为已经存在的断点增加/删除条件
4)删除断点
delete 断点编号
4、run(或 r) 运行程序
5、backtrace (或 bt)查看当前调用栈信息,也可用where
6、info locals(或 i locals) 显示当前栈帧局部变量的值
info register(或 i r) 查看寄存器
info args 查看当前桢中的参数
info catch 查看当前桢中的异常处理器
info frame N 查看调用栈中的某个栈帧
7、print(或 p)显示变量,也可以使用display
1)查看非数组变量
p 变量名 // 输出变量值
p 文件名::变量名
p 函数名::变量名 // p 'f1.c'::gv 查看f1.c文件全局变量gv的值
2)查看数组变量(包括静态数组和动态数组)
p *array@len
p *array@len // 二维数组
静态数组通过 p 数组名 也可以查看
set print element 0 // 取消Linux对打印字符串的长度限制
3)print 高级选项===查看寄存器或变量值
p/f 变量
f 输出格式:d 有符号十进制
u 无符号十进制
t 二进制(two)
x 十六进制
c 字符
f 浮点数
a 地址
8、next(或 n)执行下一条语句
9、step(或 s) 执行下一条语句,若是函数,则进入函数内部。
10、continue (或 c)继续运行程序;continue N 可以继续运行程序,并在第N+1次(即忽略N次)经过断点的时候中断。
11、watch 监视点
watch <表达式> //当表达式(可以是常量或变量)值发生变化时中断
awatch <表达式> //当表达式(可以是常量或变量)被访问或值发生变化时中断。(a代表all吧。)
rwatch <表达式> //当表达式(可以是常量或变量)被访问发生变化时中断。(r代表read吧。)
12、whatis或ptype查看变量类型。
13、frame(或 f)帧编号 // 选择栈帧
14、finish 继续运行至当前函数返回时中断。
15、set var 修改变量值 // 如 set var 变量名=值,貌似也可以不要var
set $1=2
16、jump 行号 //跳转到某行
17、x/ <n/f/u> <addr> 查看内存地址内容
其中,n为一个正整数,表示需要显示从address开始的内存单元个数。
f 表示显示格式:x 按十六进制显示
d 十进制
u 十六进制显示无符号整型
t 二进制
c 字符
f 浮点数
u 表示一个内存单元代表的字节数。默认4字节。
b/h/w/g 单、双、四、八字节
gdb环境下直接回车,即表示重复执行上一条命令。
调用gdb时可以指定"启动文件"。如:gdb --command=sf ex,表示要在可执行文件ex上运行gdb,首先要从文件sf中读取命令。
linux下,通过gdb调试多线程问题。
1、top命令或'ps -ef|grep 进程名' 获取问题进程的PID
top -H -p PID可以查看进程内所有线程的运行状态;
2、利用gdb来 attach 目标进程,执行 gdb 进程名 PID
info threads ==>查看各个线程正在执行的函数,以及gdb为各个线程分配的标号
thread 线程标号 ==> 切换到指定线程
bt==>查看线程当前的调用栈
b 断点位置 thread N if 条件 // 当线程N到达源码的指定位置且满足条件时中断
b 断点位置 thread all //为所有经过指定位置的线程设置断点。
set scheduler-locking off|on|step // 不甚理解,还需研究!
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况以外,只有当前线程会执行。
- GDB调试
- gdb 调试
- gdb调试
- gdb 调试
- GDB调试
- GDB调试
- GDB调试
- GDB调试
- GDB调试
- GDB调试
- gdb 调试
- GDB 调试
- gdb 调试
- GDB调试
- gdb调试
- gdb调试
- GDB 调试
- GDB调试
- android ubuntu no permissions
- 【软工】风险分析
- nyoj+二分函数lower_bound+大数组的注意事项
- PHP面向对象1.3对象中成员的访问和构造析构函数
- 个人博客推广声明
- gdb调试
- 超快速开平方0x5f3759df算法探究
- 黑马程序员——oc语言学习心得—— 手动管理内存
- 类的静态成员
- 12. Xcode7 使用http
- nyoj+stack的简单使用
- 黑马程序员——oc语言学习心得—— 自定义构造方法
- Intellij idea13配置tomcat,并实现一个简单的servlet
- 四、View的事件体系续