每天学点Linux命令(2)-gdb
1.gdb的作用
- 监视程序中变量值的变化
- 设置断点,使程序在指定的代码行暂停执行,便于观察。
- 单步执行代码。
- 分析崩溃程序产生的core文件。
2. gdb的使用方法
- 通过gcc生成带调试信息的文件
- gcc -g sourcefile -o program
- gdb program
- 通过core文件去执行
- gdb exefile corefile
- 调试服务程序-指定服务程序运行时的PID,gdb会自动attach上去,并调试
- gdb serverPro PID
3. gdb的常用指令
3.1 运行
命令 | 简称 | 作用 |
---|---|---|
run | r | 运行程序,在断点处会停止,等待输出 |
continue | c | 继续执行,到下一处断点或结束 |
next | n | 单步跟踪,但是不进入函数 |
step | s | 单步跟踪,进入函数 |
until | - | 之间运行退出循环,省去单步跟踪的步骤 |
until+linenumber | - | 运行至某行 |
finish | - | 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。 |
call 函数(参数) | - | 调用程序中可见的函数,并传递“参数” |
quit | q | 退出gdb |
3.2 设置断点
命令 | 简称 | 作用 |
---|---|---|
break n | b n | 在第n行设置断点,可以带上代码路径和代码名称b a.cpp:578 |
break fn1 if a>b | break->b | 条件断点设置 |
break func | b func | 在函数func()的入口设置断点 |
delete 断点号n | - | 删除第n个断点 |
disable 断点n | - | 暂停第n个断点 |
enable 断点n | - | 开启第n个断点 |
clear 行号n | - | 清除第n行的断点 |
info breakpoints | info b | 显示当前程序的断点设置情况 |
delete breakpoints | - | 清除所有断点 |
3.3 查看源代码
命令 | 简称 | 说明 |
---|---|---|
list | l | 列出程序的源代码,默认显示10行,继续list接着显示10行 |
list 行号 | 显示以行号为中心的前后10行 | |
list 函数 | 显示函数的源代码 |
3.4 打印表达式
命令 | 简称 | 说明 |
---|---|---|
print a | p a | 显示变量a的值 |
print func(a) | 显示参数为a的func调用的结果 | |
display a | 在每次单步运行之后显示a的值 | |
watch a | 设置监视点,一旦a的值改变,程序就终止 | |
whatis | 查询变量和函数 | |
info func | 查询函数 | |
info locals | 显示当前堆栈页的所有变量 |
3.5 查询运行信息
命令 | 简称 | 说明 |
---|---|---|
where/bt | 当前运行的堆栈列表 | |
bt backtrace | 显示当前调用堆栈 | |
up/down | 改变堆栈显示的深度 | |
set args 参数 | 指定运行时的参数 | |
show args | 查看设置好的参数 | |
info program | 查看程序是否在运行,进程号等信息 |
3.6 窗口分割
命令 | 简称 | 说明 |
---|---|---|
layout src | 显示源码窗口 | |
layout asm | 显示反汇编窗口 | |
layout regs | 显示源代码/反汇编和CPU寄存器窗口 | |
layout split | 显示源代码和反汇编窗口 | |
Ctrl+L | 刷新窗口 |
4.实践出真知
- 通过一个简单的例子,展示出gdb的正确使用方式。
代码
//sort.c
#include <stdio.h>
void BubbleSort(int *arrs, int size)
{
if (arrs == NULL || size <= 1)
return ;
//排序的趟数
for (int i = 0; i < size - 1; ++i)
{
for (int j = 0; j < size - i - 1; ++j)
{
if (arrs[j] > arrs[j+1])
{
int tmp = arrs[j];
arrs[j] = arrs[j+1];
arrs[j+1] = tmp;
}
}
}
}
#include "sort.h"
#include "stdio.h"
int main()
{
printf("This is a sort test");
int arrs[5] = {9,2,3,4,5};
BubbleSort(arrs,5);
for (int i = 0;i < 5; ++i)
{
printf("a[%d]:%d ", i , arrs[i]);
}
printf("The test is over");
return 0;
}
实际运行效果
-
添加断点
-
执行单步调试
-
步入函数
-
列出源码l
-
列出寄存器窗口- layout regs
)
注意事项
macbook上使用gdb比较麻烦,需要添加代码签名,具体方法可百度,本博客不做介绍。