信息显示
显示gdb版本信息 show version
显示gdb版权信息 show copying或show warranty
启动时不提示信息 gdb -q
退出时不提示信息 set confirm off
屏幕输出信息不分页 set pagination off或set height 0
函数
列出函数的名字 info functions
进入函数(有调试信息) step 缩写s
不进入函数 next 缩写n
进入没有调试信息的函数 set step-mode on
退出正在调试的函数 finish(函数执行完)| return(直接返回,不执行函数剩下的语句)
执行函数 call func() | print func()
显示函数栈桢信息 info frame
显示尾栈桢信息 set debug entry-values 1 (非0的值)
选择函数栈桢 frame n(n为层数)| frame addr
向上向下切换栈桢 up n | down n
查看函数func汇编代码 disassemble func
断点
对namespace Foo中的foo函数设置断点 b Foo::foo
对匿名空间bar函数设置断点 b (anonymous namespace)::bar
在程序地址上设置断点 b *address(b *0x400522)
获取程序入口地址Entry point readelf | gdb info files
在文件的某一行设置断点 b file:linenum(b file.c:6)
保存设置的断点和加载断点 save breakpoints savefilename | source savefilename
设置临时断点(只中断一次就删除掉) tbreak 缩写tb
设置条件断点 break xxx if cond
忽略断点 ignore bnum count (bnum 断点编号,count 忽略count次中断)
显示断点 info breakpoints 缩写i b
观察点
设置观察点 watch a (当a发生变化都会被中断)缩写wa a
查看观察点 info watchpoints
在特定线程观察点才生效 watch a thread threadid
设置读取观察点 rwatch a缩写rw a (访问a都会中断,只支持硬件观察点)
设置读写观察点 awatch a缩写aw a (读取或改变a都会中断,只支持硬件观察点)
catchpoint
只触发一次catchpoint tcatch a
系统调用设置catchpoint catch syscall mmap函数 |系统调用编号参考/usr/local/share/gdb/syscalls文件夹下的amd64-linux.xml
打印
打印ascii和宽字节字符串 x/s str | p sizeof(wchar_t) 4字节:x/ws str 2字节就用x/hs str
打印大数组内容 set print elements 0
打印数组连续元素 print array[index]@num index数组索引从0开始计数,num多少个连续元素
打印数组索引下标 set print array-indexes on
打印调用栈信息 backtrace缩写bt
打印函数局部变量 bt full | info locals
打印变量类型信息 ptype xxx
打印内存的值 x/nfu addr 以f格式打印从addr开始的n个长度单元为u的内存值
n:输出单元的个数
f输出格式:x是16进制输出,u是10进制,o是8进制,t是2进制,
u单元:b是byte,h是2个byte,w是4个byte(word),g是8个byte
打印源代码行 list缩写l list 行号或函数
使用$_和$__变量 x命令会把内存地址存放到$_,把地址中的内容存放到$__
多进程和线程
调试已运行的进程 gdb -p pid | gdb attach pid ,用detach 脱离进程
调试子进程 set follow-fork-mode child
查看线程信息 info threads
core dump文件
生成core dump文件 generate-core-file | gcore
汇编
汇编格式设置intel格式 set disassembly-flavor intel
显示将要执行的汇编指令 display /i $pc | display /3i $pc显示多条指令
打印寄存器的值 info registers | info all-registers
显示机器码 disassemble /r xxxx
改变字符串的值 set var1 = "xxx"
set {type}address=expr”的方式,含义是给存储地址在address,变量类型为type的变量赋值
set {int}0x8047a54 = 8
修改pc寄存器的值 set var $pc=0x08050949
显示动态链接库 info sharedlibrary
gdb init文件 .gdbinit
# 保存历史命令
set history filename ~/.gdb_history
set history save on
在gdb中运行shell命令 shell ls
set logging on //开启文件日志
set logging file debug.txt //设置保存文件名
//执行脚本
1.gdb -x init.gdb
2.source -v file
//设置动态库搜索路径(符号表)
set sysroot
set solib-absolute-prefix
set solib-search-path //可设置多个搜索路径,路径之间使用“:”隔开(在linux中为冒号,DOS和Win32中为分号)
16位编译器
char :1个字节
char*(即指针变量): 2个字节
short int : 2个字节
int: 2个字节
unsigned int : 2个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
32位编译器
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节