继续研究gdb相关的调试技巧,话不多说进入正题:

查看运行时数据:
这个上节中已经用过了,这里就不多说了,比较简单
还是有上节中的simple.c例子,不过得稍微做一些修改为了使用这些命令:
simple.c:
#include <stdio.h>
#include <stdlib.h> long func(int n); int main(int argc, char *argv[])
{
int i;
int x =5;
double z = 2.5;
char ch = 'q'; int arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *arr2 = (int *)malloc(sizeof(int) * 10);
for (i=0; i<10; ++i)
{
arr2[i] = i;
} printf("Entering main ...\n");
for (i=; i<argc; ++i)
{
printf("%s ", argv[i]);
}
printf("\n");
long result = ;
for (i=; i<=; ++i)
{
result += i;
}
printf("result[1-100] = %ld\n", result);
printf("result[1-10] = %ld\n", func()); printf("Exiting main ...\n");
return ;
} long func(int n)
{
long sum = ;
int i;
for (i=; i<=n; ++i)
{
sum += i;
} return sum;
}

 
【注意】:打印数组的首地址需要带&才行:
 
 
那对于静态数组是否也可以通过这种方式来查看呢?
 
 
 
 
 
程序错误:
gdb调试逻辑错误:
下面有一段有问题的代码,实现的功能是:实现逆序输出字符串hello,但是却没有任何输出,程序如下:
reverse.c:
#include <stdio.h>

int main(void)
{
int i;
char str[] = "hello";
char reverse_str[] = ""; printf("%s\n", str);
for (i=; i<; i++)
reverse_str[-i] = str[i];
printf("%s\n", reverse_str);
return ;
}

先编译运行看下结果:

下面来通过gdb来调试一下该错误:

所以此时问题的原因就被定位了,应该将o放到第一位,目前是放到第二位,然后整体的字符都回退一格,最终应该输出是这样:“olleh\000”,于是程序改装一下:

这时再编译运行:

gdb调试段错误:
下面来看下程序:
第一种情况是使用了0地址:
编译运行:
 
下面来跟踪一下这个问题,在跟踪之前来想一个问题,就是在实际项目中可能代码多较多,那如果出现段错误怎么来定位呢?实际上直接调试运行,当发现有段错误时,则会收到有一个段错误信号,并且告诉你在哪一行,所以,这就比较容易找段错误问题了:
这时可以查看栈回溯:
 
第二种情况是访问了越界的内存:
编译运行:
 
同样来调试一下:
但是对于数组越界这个错误,并不是马上就报错,如下:
编译运行:
所以,对于这种情况就比较难调试了,所以对于数组越界,在实际代码编写中一定得避免这种情况~
core文件调试:
 
默认情况下是不会产生core文件的,我们可以查看一下:
 
下面对其进行设计,我们可以设置大小不受限:
 
下面我们还是以这个程序进行生成core dump调试文件:
下面编译运行:
生成了core文件之后,下面就可以用gdb对其进行调试了。
 
 
好了,关于gdb的内容就学到这,有了它,以后调试程序就方便了~
 

gdb调试(二)的更多相关文章

  1. 一文入门Linux下gdb调试(二)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...

  2. gcc gdb调试 (二)

    GDB的命令概貌——————— 启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示: /home/hchen> g ...

  3. 应用调试(二)GDB

    title: 应用调试(二)GDBdate: 2019/1/17 21:00:10 toc: true 应用调试(二)GDB gdb下载工具安装交叉工具链设置GDB介绍编译GDBtarget/host ...

  4. Linux——【转】gcc编译与gdb调试简要步骤

    原文:gcc编译与gdb调试简要步骤 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定义和include文件展开等工作:(.i) l 根据编译参数进行不同程 ...

  5. gdb 调试

    一.gdb 调试-源代码关联 在调试程序的过程中,可以自由地查看相关的源代码(如果有源代码的话)是一项最基本的特性.gdb 当然也提供了这项特性,虽然不如IDE直观,但在一定程度上要比IDE更加灵活和 ...

  6. gcc编译与gdb调试简要步骤

    http://blog.chinaunix.net/uid-24103300-id-108248.html 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定 ...

  7. core dump gdb调试

    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIG ...

  8. gcc编译, gdb调试, makefile写法

    //test.c: #include <stdio.h> int main(void) { printf("hello world!"); return 0; } == ...

  9. 比较全面的gdb调试命令 (转载)

    转自http://blog.csdn.net/dadalan/article/details/3758025 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形 ...

随机推荐

  1. [LeetCode] 236. Lowest Common Ancestor of a Binary Tree 二叉树的最近公共祖先

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...

  2. win运行canal

    1.mysql开启log_bin 用命令查看是否开启 SHOW VARIABLES LIKE 'log_bin'; OFF为未开启,ON为开启 Win环境的话找到my.ini,Linux环境的话找到m ...

  3. phpexcel无法导出的解决方法

    phpexcel无法导出的解决方法 <pre> set_time_limit(0); ini_set("memory_limit","512M"); ...

  4. react-native样式里面的一些坑

    在我们做react-native项目时,引入css样式之后 控制台报下面的这样的错 解决问题的方法是: 报错的代码 改后的代码

  5. JavaScript进行WebSocket字节流通讯示例

    websocket进行通讯时,可以选择采用字符串或者字节流的传输模式.但在发送与接收时,需要考虑数据的分包,即分成一个个请求与响应消息.无论是采用哪种传输模式,都不免要遇到这个问题. 采用字符串传输时 ...

  6. Spring Cloud--实现Eureka的高可用(Eureka集群搭建)实例

    将10086注册到10087上: 再在10086服务的基础上复制一个Eureka的服务,端口为10087,将其注册到10086上: application-name的名称保持一致,只是一个服务的两个实 ...

  7. Luogu4548 CTSC2006 歌唱王国 概率生成函数、哈希

    传送门 orz ymd 考虑构造生成函数:设\(F(x) = \sum\limits_{i=0}^\infty f_ix^i\),其中\(f_i\)表示答案为\(i\)的概率:又设\(G(x) = \ ...

  8. ubuntu 18.04安装RTX 2060 显卡驱动

    第一:安装ppa的显卡驱动源 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update 第二:检查显卡和推荐驱动 ubuntu- ...

  9. 2.3_Database Interface ODBC组成原理

    从某种意义上来讲,ODBC实际上主要是一个数据库的访问库(API),它包含访问不同数据库所要求的ODBC驱动程序.应用程序要操作不同类型的数据库,只要调用ODBC所支持的函数,动态链接到不同的驱动程序 ...

  10. linux route详细解读

    route命令用于显示和操作IP路由表.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.在Linux系统中,设置路由通常是 为了解决以下问题:该Linu ...