Liunx操作-Record10—gdb调试的相关命令

目录

gdb调试命令

启动gdb:gdb app(对应可执行程序名)

r(un) 启动

start 启动

 n(ext) 执行下一行代码

s(tep)  执行下一行代码

q(uit) 退出gdb

设置启动参数:"set args 10 6"

设置断点(run在断点处停止)

b 行号---主函数所在文件的行:"b 17"

l(ist) 查看代码,默认显示10行(显示主函数)

list 文件名:行号(开始行号)

删除断点,d(el) 编号(可以同时删除多个断点d 1 3 4)

查看断点 i(nfo) b,得到编号

c(ontinue) 跳到下一断点

p(rint) 打印变量的值,结构体也也可以打印

ptype  打印变量的类型

set 设置变量的值

display 显示变量的值

undisplay 删除显示变量,查看编号,info display

设置条件断点 b line if i == 1


gdb调试命令

gdb调试,是linunx给我们提供的神器,当代码有bug的时候,用于调试。

经验之谈,gdb调试的目的是找到bug, 并且解决bug,这就需要程序员对自己的程序非常了解,而且,至少知道bug位于那个部分才行,一般调试bug的方式,要么是用gdb,要么是查看日志,无非就是这两种。

首先要明白的是,在编译的时候,加入了"-g"参数,这样才能使用gdb调试,

举例说明,执行一下程序并进行编译:

main.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "head.h"
typedef struct TTfunInfo
{
    int fun_type;//函数的类型
    int a;//函数的第一个参数
    int b;//函数的第二个参数
    char funname[10];//函数名称
}TfunInfo;
int main(int argc,char *argv[])
{
    int a = 2;
    int i = 0;
    int a1 = 10,b1=5;
    TfunInfo funinfo[2];
//    char *Msg="I will die!";
//    Msg[0] = '1';
    if(argc == 3)
    {
        a1 = atoi(argv[1]);
        b1 = atoi(argv[2]);
        funinfo[0].a = a1;
        funinfo[0].b = b1;
        funinfo[1].a = a1;
        funinfo[1].b = b1;
        
    }
    for(i = 0; i < 2; i ++)
    {
        printf("i===%d,LINE=%d\n",i,__LINE__);
        if(i == 0)
        {
            funinfo[i].fun_type = 1;//call sum
            printf("begin call sum\n");
            strcpy(funinfo[i].funname,"sum");
            sum(funinfo[i].a,funinfo[i].b);
        }
        if(i == 1)
        {
            funinfo[i].fun_type = 2;//call mul
            printf("begin call mul\n");
            strcpy(funinfo[i].funname,"mul");
            mul(funinfo[i].a,funinfo[i].b);
        }
    }
    printf("byebye\n");
    return 0;
}

func.c

#include <stdio.h>
#include "head.h"

int sum(int a,int b)
{
    printf("welcome call %s,a=%d,b=%d\n",__FUNCTION__,a,b);
    return a+b;
}
int mul(int a,int b)
{
    printf("welcome call %s,a=%d,b=%d\n",__FUNCTION__,a,b);
    return a*b;
}

 进行编译:"gcc func.c main.c -o app -I ./ -g",其中,加入了"-g"参数,调用了gdb调试,

其结果文件如下:

发现里面的至是乱码的,应该传递进去参数才可以:

这样看就正常了。

启动gdb:gdb app(对应可执行程序名)

那么下面来启动gdb调试:"gdb app"

如上标红部分,说明进入了gdb的管理部分,

进入后,可以执行一些命令,在gdb启动程序:

r(un) 启动

run指定参数启动:"run 12 7" 

start 启动

(另一种启动方式)-停留在main函数,相当于开始分步调试

 n(ext) 执行下一行代码

(在start启动的前提下,敲入n,相当于逐行执行下一条指令)

或者,在上一条指令执行的是"n"的前提下,敲入回车,相当于继续执行上一条指令。可以继续下一行代码。

s(tep)  执行下一行代码

(和"n"的功能一样,区别在于"step"可以进入到函数内部,但只能进入到当前代码中包括的函数,库函数或系统函数不能进)

q(uit) 退出gdb

像遇到上面那种出现问题的状况的时候,就只能先退出了

设置启动参数:"set args 10 6"

执行的时候,可以给程序指定参数

设置断点(run在断点处停止)

b 行号---主函数所在文件的行:"b 17"

  1. b 函数名 :"sum"
  2. b 文件名:行号(指定行号,设置断点):"b main.c:17"
  3. 查看当前代码一共设置了多少个断点:"info b"
  4. 原先设置的断点,一旦退出gdb调试再进入后,就都没了

当然,也可以根据函数来设置断点:"b 函数名" (这就需要设置者对代码比较熟了)

l(ist) 查看代码,默认显示10行(显示主函数)

按回车键,会继续显示下一个10行的代码, 

list 文件名:行号(开始行号)

  1. l  -- 显示主函数对应的文件
  2. l 文件名:行号

删除断点,d(el) 编号(可以同时删除多个断点d 1 3 4)

查看断点 i(nfo) b,得到编号

c(ontinue) 跳到下一断点

可以按断点去跳

p(rint) 打印变量的值,结构体也也可以打印

ptype  打印变量的类型

set 设置变量的值

可以在执行过程中,将参数进行修改

display 显示变量的值

用于追踪,查看变量具体什么时候变化:"display 需要跟踪的变量"

每次运行,都会把这个变量的值给显示出来

undisplay 删除显示变量,查看编号,info display

设置条件断点 b line if i == 1

设置到符合条件的时候,断点生效:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值