gdb调试工具

vim中的跳转

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调试工具
添加调试信息后明显程序大小变大

gdb调试

调试命令为

gdb a.out

gdb调试工具
b/break + 行号设置断点
d/delete + 行号 清除断点
r/run 运行,运行到第一个断点处
s/step 单步运行,即进入函数,注意只能是自己定义的函数,不能是系统函数
n/next 下一行
until + 行号:跳到(多少)行,可以用来作为单步函数的跳出
p/print + 变量名: 查看变量的值
c/continue:跳到下一个断点或结束
quit : 退出

gdb调试其他指令

当出现段错误的时候,在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中,栈帧如图所示
gdb调试工具
此时使用ptype p并不能查看p的变量,可以先bt查看栈帧关系,
gdb调试工具
p在栈帧1里,所以可以frame 1进入main,此时在使用ptype p就可以查看类型

display: 观察执行变量,比如i的for循环中,设置display i,那么每次执行的时候都会打印i的值,很管用
undisplay:取消跟踪

常见错误

如果编译的时候忘记加 -g
gdb调试会报错,此时可以用file a.out也可以实现编译功能

上一篇:gdb 无符号表信息


下一篇:腾讯地图使用