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 a.out
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中,栈帧如图所示
此时使用ptype p并不能查看p的变量,可以先bt查看栈帧关系,
p在栈帧1里,所以可以frame 1进入main,此时在使用ptype p就可以查看类型
display: 观察执行变量,比如i的for循环中,设置display i,那么每次执行的时候都会打印i的值,很管用
undisplay:取消跟踪
常见错误
如果编译的时候忘记加 -g
gdb调试会报错,此时可以用file a.out也可以实现编译功能