编译

hello.c

#include <stdio.h>

void main(int argc, char *argv[]){

    if(argc > 1){
        printf("First argv: %s\n",argv[1]);
    }else{
        printf("No argv!\n"icon_question.gif;
    }
}

编译

gcc -g hello.c -o hello.o

进入调试

gdb hello.o

帮助命令

help [命令]

启动程序

run [命令行参数]

Snipaste_2020-08-24_11-00-44.png

GDB支持命令的缩略形式,还支持TAB键快速补齐

Snipaste_2020-08-24_11-50-44.png

也可以使用start命令启动程序,会自动执行到main函数

start [命令行参数]

Snipaste_2020-08-23_01-14-46

设置断点

可以指定函数、指定行数设置断点

break [file:]function
    Set a breakpoint at function (in file).

Snipaste_2020-08-24_11-17-53.png

查看所有断点

info break

删除断点(通过指定源代码行数),若指定函数名,则删除该函数所有断点

clear 源代码行数/函数名

删除断点(通过指定断点编号),若不指定编号,则删除所有断点

delete [断点编号]

禁用断点

disable 断点编号

启动断点

enable 断点编号

Snipaste_2020-08-24_15-55-56.png

单步执行

step 相当于其他调式程序中的step into/步进

遇到子函数时会进入子函数继续单步执行

next 相当于其他调试程序中的step over/跨越

遇到子函数时会当作一个整体,直接返回子函数的执行结果

finish 相当于其他调试程序中的step out/步出

直接执行完当前函数,返回到上层函数调用处

查看变量

print 变量名/表达式

Snipaste_2020-08-24_15-21-18.png

支持以不同的形式进行输出

Snipaste_2020-08-24_15-47-27

display 变量名/表达式

使用display命令设置变量名/表达式后,每次程序暂停都会自动打印该变量/表达式的值

Snipaste_2020-08-24_15-35-58

可以使用info display查看所有设置的变量/表达式

可以使用undisplay 编号删除设置的变量/表达式

Snipaste_2020-08-24_15-38-03

查看变量的内存地址

print &变量

监控变量

watch 变量名/表达式

设置完待监控的变量后

执行continue(c)命令后,程序会一直运行到该变量值发生改变

Snipaste_2020-08-24_15-04-58

可视化页面

ctrl+x a

按住ctrl+x,然后松开ctrl,然后a

或者ctrl+x 1

Snipaste_2020-08-23_01-24-23

同时打开反汇编窗口

ctrl+x 2

按住ctrl+x,然后松开ctrl,然后1

Snipaste_2020-08-24_18-17-03

执行Python代码

通过python命令进入shell,通过end命令退出shell

Snipaste_2020-08-24_09-58-28

也可以不进入python shell直接执行python代码

Snipaste_2020-08-24_10-07-01

需要留意的是,自带一个gdb模块

Snipaste_2020-08-24_10-09-58

利用gdb模块,查看所有断点

python print(gdb.breakpoints)

Snipaste_2020-08-24_10-13-59

其他

查看当前行数附近行或者指定函数

默认显示10行

list

Snipaste_2020-08-23_01-19-13.png

搜索关键字

search

参考文章

Give me 15 minutes & I'll change your view of GDB

GDB Text User Interface

1小时玩转Linux gdb命令

文章目录