gdb调试程序

简介: 编写test2.c                     编译成可执行文件 gcc test2.c -g -o test2 gdb test2 进入gdb调试 run命令 run命令格式 run 其中run可以简写成r,gdb中大部分指令可以简写。

编写test2.c

image

 

 

 

 

 

 

 

 

 

 

编译成可执行文件

gcc test2.c -g -o test2
gdb test2

进入gdb调试

run命令

run命令格式

run <arg1...argn>

其中run可以简写成r,gdb中大部分指令可以简写。

在gdb中执行

run lvyahui blog

可以看到输出

image

再次运行run可以不需要再传递参数,它会使用最后一次调用run命令传递的参数

image

可以看到默认参数

image

可以再次执行带参数的run或者使用set agrs 修改默认参数

image

断点

设置断点

break <line-number>

可以在vim编辑器中查看行号或者通过list/l指令查看行号

image

编辑代码文件test1.c

image

编译好test1

gcc test1.c -g -o test1
gdb test1

进入gdb环境

先查看代码,然后设置一个断点,再run执行,让后continue继续执行

image

在方法前添加断点

break可以直接在方法前添加短点

break fun_name

image

在此调试执行

image

删除断点

下面看怎么删除之前设置的短点

delete breakpoint <point-number> #删除指定断点
#或者
delete breakpoints  #删除所有断点

其中 delete可以简写成d

image

另外clear命令也可以用来清除断点

按表达式设置断点

break <line number> if expression

image

按照上面的方法步骤设置断点,发现失败了,提示No symbol var in current context

起初我以为是这样的设置需要在运行中设置,于是在13行设置断点,运行,当停在13行时,再在第15行设置一个条件断点,但

最后发现问题依旧。显然问题不在这里,后来上网查了下,在编译时加上一个-gstabs+选项

gcc -g -gstabs+ -c test1.c
gcc test1.o -o test1

再次进入gdb 调试

发现就可以设置这个条件断点了

image

可以使用readelf看两次不同方法编译生成的.o文件的符号表有所不同。

run执行下看看

但是执行发现断点没有起作用

image

虽然不知道为什么,但显然之前是因为编译器做了编译优化,但我明明没有加任何-OX选项啊。后来把i==50换成i>=50,发现可以停下来了。

image

真是郁闷,i怎么会是这个值呢?

如果是多文件程序,break还可以指定文件添加断点,格式如下

break <filename:line-number>
break <filename:fun-name>
#例如
break test1.c:15
break test1.c:main

禁止和启用断点

格式

disable/enable breakpoint num

image

观察点

观察点也可以起到断点的作用

编辑test3.c文件

#include <stdio.h>

int sum(int a){
    int i,res = 0;
    for(i=0;i < a;i++){
        res += i;
    }
    return res;
}
int main(void){
    int a = 10;
    int asum = sum(a);
    printf("asum is %d \n",asum);
    return 0;
}

编译

gcc -g -gstabs+ -Wall test3.c -o test3

watch 命令需要在运行程序后使用看,所以我们要先加一个断点让程序停下来

image

将断点删除,继续执行

image

查看运行数据

在运行时常常使用print命令来查看数据,再次之前,需要先知道如何单步执行,进入函数,运行到下一个断点

  • next--执行一行源代码但不进入函数内部。
  • step--执行一行源代码而且进入函数内部。
  • continue -- 执行到下一暂停点或程序结束。

再次调试test1程序

image

print的格式

print <expression>
#或者
p <expression>

其中expression可以是各种形式

表达式

p (i-6)*3+result

函数调用

p func(5)

数组

p *arr_name@arr_length

编写test4.c

#include <stdio.h>
#include <string.h>

int main(void){
    int arr[] = {1,2,3,4,5};
    int len = 4,i;
    int * arr2 = (int *) malloc(len * sizeof(int));
    for(i=0;i<len;i++){
        arr2[i]= i*2;
    }
    free(arr2);
    return 0;
}

进入gdb调试

image

自动显示变量

display/fmt expr

image

控制格式的字符更printf的非常相似,在此不做赘述

以上是个人总结的gdb的一些基础内容,更多内容会在后续博客中提及

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
6月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
368 2
|
6月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
58 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
87 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
40 1
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
29 0
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试
Linux C/C++ gdb调试