背景
程序发布有两个版本,Debug模式和Release模式
Linux下gcc/g++出来的二进制程序默认是release模式
要使用gdb调试,必须在源代码生成二进制程序时加上 -g 选项(如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址)
gdb功能
gdb可实现以下四个功能:
启动程序,自定义运行
设置断点
当程序停止可检查程序发生的事
动态改变程序执行环境
调试实例
main.c
#include <stdio.h>
int Add(int a, int b){
return a + b;
}
int main(){
int result = Add(2, 3);
int i = 1;
int sum = 0;
for(; i < 10; ++i){
sum += i;
}
printf("sum = %d\n", sum);
printf("result = %d\n, result); printf("Hello World!\n"); printf("^_^嘻嘻嘻\n"); return 0; }
调试过程:
常用指令
list(l)行号:显示某行源代码,每次列十行(上5行下5行)
list(l) 函数名:列出某函数源代码(上2行下8行)
break(b) 行号:在某一行设置断点
break(b) 函数名:在某个函数开头设置断点
info break:查看断点信息
info(i) breakpoints:查看当前设置了哪些断点
delete(del) breakpoints:删除所有断点
delete(del) breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
run(r):运行程序
next(n):单条执行
step(s):进入函数调用
continue(c):继续执行,非单步执行
p 变量:打印变量值
breaktrace(bt):查看函数堆栈
frame 0:查看栈顶
frame 1:查看第二层栈
disassemble 函数名:查看函数汇编
quit(q):退出gdb调试
数据输出格式
- x 按十六进制格式显示变量。
- d 按十进制格式显示变量。
- u 按十六进制格式显示无符号整型。
- o 按八进制格式显示变量。
- t 按二进制格式显示变量。
- a 按十六进制格式显示变量。
- c 按字符格式显示变量。
-
f 按浮点数格式显示变量。
如:
p i (按十进制格式打印变量i)
p/x i (按十六进制格式打印变量i)