K 跳转到函数说明
*或# 跳转到自定义的函数上
/[d 查看宏定义
/************************************************************************* > File Name: gdbtest.c > Author: shaozheming > Mail: 957510530@qq.com > Created Time: 2022年02月19日 星期六 16时45分58秒 ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <time.h> #define N 10 char *str = "hello "; int var = 0; void init_arr(int *arr, int len) { int i = 0; for(i = 0; i < len; ++i){ arr[i] = rand() % 20 + 1; } } void select_port(int *arr, int len) { int i, j, k, tmp; for(i = 0; i < len-1; ++i){ k = i; for(j = i + 1; j < len; ++j){ if(arr[k] > arr[j]) k = j; } if(i != k){ tmp = arr[i]; arr[i] = arr[k]; arr[k] = tmp; } } } void print_arr(int *arr, int len) { int i; for(int i = 0; i < len; ++i){ printf("arr[%d] = %d \r\n", i, arr[i]); } } int main(int argc, char* argv[]) { int arr[N]; char *p = "hellod"; srand(time(NULL)); init_arr(arr, N); print_arr(arr, N); select_port(arr, N); printf("------------after sort----------\r\n"); print_arr(arr, N); while(1); return 87; }
添加调试信息后明显程序大小变大
调试命令为
gdb a.out
b/break + 行号设置断点
d/delete + 行号 清除断点
r/run 运行,运行到第一个断点处
s/step 单步运行,即进入函数,注意只能是自己定义的函数,不能是系统函数
n/next 下一行
until + 行号:跳到(多少)行,可以用来作为单步函数的跳出
p/print + 变量名: 查看变量的值
c/continue:跳到下一个断点或结束
quit : 退出
当出现段错误的时候,在gdb中使用run会直接显示段错误位置
start:直接从程序的第一行开始执行
finish:结束当前函数调用(跳出函数或者跳出循环),适用于,不小心用s进入了系统函数,想要退出来,也可以退出循环
set + 参数 + 值:比如调用。./a.out aa bb cc, aa bb cc 是args的参数,但是在gdb中就使用set就可以了(也可以run加参数 run aa bb cc )
info:信息,比如info b是查看断点信息
设置条件断点: b+行数+if,比如循环里的,就不用重新循环找
ptype: 查看数据类型,但必须得在函数里才行,因为变量的名字可能会不一样
backtrace/bt:查看函数调用的栈帧和层级关系
frame/f:切换函数的栈帧
当main函数中存在p变量,程序在函数A中,栈帧如图所示
此时使用ptype p并不能查看p的变量,可以先bt查看栈帧关系,
p在栈帧1里,所以可以frame 1进入main,此时在使用ptype p就可以查看类型
display: 观察执行变量,比如i的for循环中,设置display i,那么每次执行的时候都会打印i的值,很管用
undisplay:取消跟踪
如果编译的时候忘记加 -g
gdb调试会报错,此时可以用file a.out也可以实现编译功能