gdb调试

案例代码

#include <stdio.h> 
#include <stdlib.h> 
  
struct st 
{ 
        int a; 
        int b; 
}; 
 
void print_array(char* array, int len) 
{ 
        int i = 0; 
        for(i = 0; i < len; i++) 
        { 
                printf("array[%d]: %c\n", i, array[i]); 
        } 
} 
 
int main(int argc, char* argv[])
{
        struct st st_temp;
        int i = 0;
        char array[5];

        st_temp.a = 10;
        st_temp.b = 11;

        for(i = 0; i < 5; i++)
        {
                array[i] = i + '0';
        }   
        print_array(array, 5);

        for(i = 0; i < argc; i++)
        {
                printf("hello...argv[%d]: %s\n", i, argv[i]);
        }

        return 0;
}

运行中设置参数进行调试

启动gdb时制定执行文件参数

gdb --args exe paras
在这里插入图片描述

运行时设置参数

  • 1、将断点设置在函数上 b print_array
  • 2、 执行 r
  • 3、设置函数运行参数set paras.
  • 4、c执行
    在这里插入图片描述

运行时指定

在这里插入图片描述

查看及修改运行环境

  • 查看程序的运行路径
    • show paths
  • 查看环境变量
    • show environment
  • 设置环境变量
    • set environment PARA=para

跳转

n(next)执行下一条语句、不进入函数内部

num 代表执行多少行
(gdb) n num

s(step)执行下一条语句、进入函数内部

在遇到函数的时候会进入函数内部
(gdb) s num
(gdb) finish 跳出来

跳出循环体

(gdb) u

跳转至某一行

(gdb)until num

查看程序运行时信息

在这里插入图片描述

如果你用指针(或地址)来设置观察点,一定要解引用,* 指针才是对指针所指向的变量进行观察如果不解引用,那就是对指针变量本身(地址)进行观察。另外,如果你观察一个临时变量或表达式,当它的生命周期结束的时候,对应的观察点也就失效了

(gdb)p val 打印变量 val 的值
(gdb)p &val 打印变量 val 的地址

跟踪变量变化 display

查看某个变量或表达式的值,和 p 命令类似,但是 display 会一直跟踪这个变量或表达式值得变化,每执行一条语句都会打印一次变量或表达式的值。
在这里插入图片描述

查看栈信息info frame\ bt

函数调用时,会在内存中产生一块栈帧 保存函数调用位置、函数参数、函数内部的临时变量
在这里插入图片描述
查看当前所有栈帧bt
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值