开始

gdb [程序名]:启动调试。

llist:显示源代码(默认显示10行)。

b main:在main函数设置断点。

b section1.cpp:16:在源文件第16行设置断点。

i b:查看所有断点信息。

rrun:开始执行程序,到断点会停下来。

nnext:往下继续执行一行。

p [变量名]:查看变量的数值。

i locals:查看所有(执行到目前为止的)局部变量的数值。

c:继续执行,直到下一个断点。

quitq:退出gdb。

启动调试

gdb --args myProgram 1 2 "3 4":设置传入命令行参数,或者进入gdb命令行后输入set args 1 2 "3 4"再通过run运行程序,或者直接在进入gdb命令行后运行r 1 2 "3 4"也可。

gdb attach [PID]:根据PID调试正在运行中的程序,或gdb --pid [PID]

nnext:Step-over单步执行。

sstep:Step-into单步执行。

finish:完成当前函数的执行,退出当前函数至原调用函数的下一句。

detach:退出调试,不影响当前程序执行。

断点

b main.cpp:38:在指定行号设置断点。

b funcName:为所有具有相同名字的函数设置断点。

rb [正则表达式]:为所有满足条件的函数设置断点。

b main.cpp:14 if i==90:设置条件断点,尤其在循环中有用。

delete:删除所有断点。

tb main.cpp:14:设置临时断点,断点只会被命中一次。

info breakpointsinfo breaki b:查看所有断点。

i b 2:查看指定编号断点的信息。

delete 5:删除指定编号的断点。

disable 1:禁用指定编号的断点。

enable 1:启用指定编号的断点。

变量

p argcp argv[0]等:查看指定变量。

i argsinfo args:查看函数参数变量。

set print null-stop:设置不打印空字符。

set print pretty:让结构体各成员分行显示。

set print array on:让数组分行显示。

p sizeof(int)p sizeof(long)p strlen(name)p test.age=25p strcpy(test.name, "Some"):通过p执行一些简单命令。

p i=8:修改某变量的值。

内存

x [内存地址](如x &test,也可先通过p &test获取test变量的内存地址):查看变量的内存布局。

x /4b &test:查看test变量的4个字节的内存布局。例如对int test = 0x12345678,执行该命令后得到0x7fffffffd5a4: 0x78 0x56 0x34 0x12,表明当前机器为小端存储(低位地址存储低位字节)。

x /s test_str:查看字符串。

x /20b &test(可提前通过p sizeof(test)获取结构体大小):查看结构体内存分布。

set test.gender=110:修改内存。

寄存器

info registersi registers:查看所有寄存器。

info all-registers:更多寄存器。

i r [寄存器名](如i r rdx):查看某个寄存器值。

例如,通过i r rdi得到rdi 0x555555556004 93824992239620,假如rdi存储某字符串指针,则可通过x /s 0x555555556004p (char*)0x555555556004得到其指向的字符串值。

i r pci r rip:查看PC寄存器。

info line 15:查看某行对应汇编指令的起始和终止地址。

p $rip=0x555555555217set var $rip=0x5555555551ee:修改PC寄存器值。

代码查看

listl:默认查看当前执行行的前后5行(共10行)。

l -:往前显示。

l [函数名](如l test_c::test_memberl test.cpp:test_member):查看函数代码。

l main.cpp:10:查看指定行号的代码。

set listsize 15:控制每次显示代码的行数。

l 0:回到代码开头。

search test:查找包含test的符号。

forward-search test:正向查找,同search

reverse-search test:反向查找。

show directories:查看源代码搜寻目录。

directory [文件路径]:添加源文件搜索路径。

栈帧

btbacktrace:查看栈帧。

frame 2f 2f [栈帧地址]:切换到某个编号的栈帧。

info f 0:查看某个编号的栈帧的信息。