启动命令
gdb调试主要是c和c++,要使用gdb,在编译时要在加编译条件
1
2gcc -g hello.c -o hello
g++ -g hello.cpp -o hello启动gdb的几种方法
1
2
3
4
5
6
7gdb program #program就是可执行文件,一般在当前目录下
gdb program core #用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件
gdb program 1234 #程序如果是服务程序,可以指定这个服务程序运行时的进程ID,gdb会自动attach上去,并调试他。gdb启动时候可以加一些gdb启动开关
--symbols=SYSFILE #从指定文件中读取符号表
--se=FILE #从指定文件中读取符号表信息,并把他用在可执行文件中
--core=COREFILE #调试时core dump的core文件
--directory=DIR #加入一个源文件的搜索路径,默认搜索路径是环境变量中PATH所定义的路径
基本命令
help查看所有gdb命令
1
2help 列出gdb命令种类
help breakpoints 查看设置断点的所有命令查看源代码
1
2
3
4list(简写l) #查看源程序代码,默认显示10行,按回车继续查看剩余
list行号 #将显示当前文件以“行号”为中心的前后10行代码
list 函数名 #将显示“函数名所在函数的源代码”
list #不带参数,将接着上一次list命令,输出下边的内容断点相关
1
2
3
4
5
6
7
8b 行号 #在某行设置断点
info b #显示所有断点信息
delete b #清除所有断点
clear 行号n #清除第n行的断点
b func #在函数入口处设置断点
delete 断点号n #删除第n个断点
disable 断点号n #暂停第n个断点
enable 断点号n #开启第n个断点调试相关
1
2
3
4
5
6
7
8
9
10r #运行程序
n #单步执行,跳过函数,不进入函数
s #单步执行程序,进入程序
until #跳出循环
until+行号 #运行至某行,不仅仅用来跳出循环
finish #运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息
call func(arg) #call 函数(参数):调用程序中可见的函数,并传递参数 call gdb _myfunc(44)
q #退出
disassemble /r main #反汇编代码,/r选项表示显示原始的机器码
x/[n][f][u] address#查看内存 n要显示的单位数量,f显示格式 xduotfaics u 单位大小 b(字节)h(2字节)w(4字节)g(8字节)打印表达式
1
2
3
4
5
6
7
8
9
10p a #将显示整数a 的值
p ++a #将把a中的值加1,并显示出来
p name #将显示字符串name的值
p test(22) #将以整数22作为参数调用test()函数
p test(a) #将以变量a作为参数调用test()函数
display 表达式 #使用display命令设置一个表达式后,将在每次单步进行指令后,接着会输出被设置的表达式及值
watch 表达式 #设置一个监视点,一旦被监视的表达式的值改变,gdb将强行终止正在被调试的程序
whatis #查询变量或函数
info function #查询函数
info locals #显示当前堆栈页的所有变量查看运行信息
1
2
3
4
5
6where/bt #当前运行的堆栈列表
bt backtrace #显示当前调用堆栈
up/down #改变堆栈显示的深度
set args #指定运行时的参数
show args #查看设置好的参数
info program #来查看程序是否在运行,进程号,被暂停的原因分割窗口
1
2
3
4
5
6layout #用于分割窗口,可以一边查看代码,一边测试
layout #显示源代码窗口
layout asm #显示反汇编窗口
layout regs #显示源代码/反汇编和CPU寄存器窗口
layout split #显示源代码和反汇编窗口
Ctrl+L #刷新窗口