gdb学习(二)[第二版]

简介: 查看运行时数据print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype “aaa” 打印字符串”aaa”的类型 #ptype array 打印...

查看运行时数据

print - 查看变量值

 

ptype – 查看变量类型

#ptype i

#ptype “aaa” 打印字符串”aaa”的类型

#ptype array 打印数组array的类型

#ptype main 打印main函数的类型

 

print array – 查看数组

#p arr1

#p arr1[2] 查看数组arr2第三个元素值

#p &arr1[2] 打印数组元素的地址

#p &arr1 打印数组首地址,与p &arr1[0]作用类似

 

print *array@len – 查看动态内存

#p *arr2@10 

#p *arr2@15  #将数组越界之后的内存也打印出来了

#p *arr@10 #静态的数组也可以改方式打印

#p arr[2]@2 #从arr[2]开始的两个元素

#p arr@2 #打印两个数组

 

print x=5 – 动态改变运行时数据

#print i = 1000

 

程序错误

编译错误:编写程序的时候没有符合语言规范导致编译错误【语法错误】。

运行时错误:编译器检查不出这种错误,但在运行的时候可能会导致程序崩溃【如:内存地址非法访问】。

逻辑错误:编译和运行都很顺利,但是执行结果不对

 

gdb调试逻辑错误

//示例-实现逆序输出字符串hello,但是却没有任何输出
#include <stdio.h>
int main(void)
{
        int i;  
        char str[6] = "hello";
        char reverse_str[6] = "";

        printf("%s\n", str);
        for (i=0; i<5; i++)
                reverse_str[5-i] = str[i]; 	
//Error:应该是reverse_str[4-i]...

        printf("%s\n", reverse_str);
        return 0;
}



gdb调试段错误

段错误是由于访问非法地址而产生的错误。

1、访问系统数据区,尤其是往系统保护的内存地址写数据。最常见就是给一个0地址指针赋值 

2、内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域

//示例
#include <stdio.h> 
#include <stdlib.h> 

void segfault1()
{ 
	int *p = NULL; 
	*p = 100; 
} 

void segfault2() 
{ 
	char buf[1] = "a"; 
	buf[13] = 'A'; 
	printf("%c\n",buf[13]); 
} 

void segfault3()
{ 
	char buf[1] = "a"; 
	buf[10] = 'A'; 
	printf("%c\n",buf[10]); 
} 


int main() 
{ 
	segfault1(); 
//	segfault2(); 
//	segfault3(); 

	return 0; 
} 

where命令 or bt命令:栈回溯,显示导致段错误的执行函数树

 


wh命令查看程序代码窗口

 

 

core文件调试

1、core文件

在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫做core dump

 

2、设置生成core文件

ulimit -c   #查看core-dump状态

ulimit -c 数字 (如:ulimit -c 1024)

ulimit -a #用于查看当前所有状态信息

 

将ulimit -c unlimited写入~/.bashrc,则默认会生成core文件

 

3、gdb利用core文件调试

gdb 程序名 [core-file] #如:gdb bugging core



相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
NoSQL Linux 文件存储
GDB学习入门之gdb准备2
GDB学习入门之gdb准备2
126 0
GDB学习入门之gdb准备2
|
NoSQL Shell Linux
GDB学习入门之gdb准备
GDB学习入门之gdb准备
114 0
|
NoSQL 小程序 C语言
GDB调试学习(四):段错误
GDB调试学习(四):段错误
397 0
|
NoSQL
GDB调试学习(三):观察点
GDB调试学习(三):观察点
132 0
|
NoSQL
GDB调试学习(二):断点
GDB调试学习(二):断点
158 0
|
3月前
|
存储 NoSQL C语言
GDB学习整理
GDB(GNU Debugger)是一款功能强大的调试工具,用于调试C、C++等程序。它允许开发者启动程序、设置断点、单步执行、查看和修改变量值、检查调用栈(stack frame)等。用户可通过命令行操作GDB,常用命令包括:`run` 启动程序、`break` 设置断点、`next` 单步执行、`continue` 继续执行、`print` 打印变量值、`quit` 退出GDB。GDB还支持初始化文件(如`.gdbinit`),可在启动时自动加载配置或脚本。通过断点条件、监视点、回溯(backtrace)等功能,开发者能高效排查程序错误。
160 0
|
NoSQL IDE Linux
Linux的学习之路:8、Linux调试器-gdb使用
Linux的学习之路:8、Linux调试器-gdb使用
130 0
|
NoSQL Shell C语言
GDB调试学习(一):单步执行和跟踪函数调用
GDB调试学习(一):单步执行和跟踪函数调用
314 1
|
NoSQL 编译器 Linux
GDB 学习入门之GDB初识
GDB 学习入门之GDB初识
166 0
|
NoSQL Linux Android开发
OPENJTAG调试学习(三):使用 gdb 命令行进行调试
OPENJTAG调试学习(三):使用 gdb 命令行进行调试
246 0