继续研究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. snapde的批量数据运算公式

    一.snapde基本介绍 Snapde,一个专门为编辑超大型数据量CSV文件而设计的单机版电子表格软件:它能打开最大3G大小的CSV文件进行编辑:它运行的速度非常快,反应非常灵敏. 二.snapde批 ...

  2. MiniProfiler 来分析 ASP.NET Core

    使用 MiniProfiler 来分析 ASP.NET Core 应用   使用 MiniProfiler 来分析 ASP.NET Core 应用 MiniProfiler(https://minip ...

  3. idea中默认maven配置

    使用idea时,通常会配置自己的maven,但是发现每创建一个新项目都需要重新配置一遍,原来在idea中有一个默认配置,修改后就会全局生效,具体配置如下: 简单两步,配置完成.

  4. vscode插件Power Mode

    Power Mode官网 设置里添加 "powermode.enabled": true, "powermode.presets": "flames& ...

  5. Ubuntu环境下非root用户指定版本Python的安装及虚拟环境virtualenv的使用

    Ubuntu环境下非root用户指定版本Python的安装及虚拟环境virtualenv的使用 参考博客: https://blog.csdn.net/leviopku/article/details ...

  6. python基础篇(六)

    PYTHON基础篇(六) 正则模块re A:正则表达式和re模块案例 B:re模块的内置方法 时间模块time A:时间模块的三种表示方式 B:时间模块的相互转换 随机数模块random A:随机数模 ...

  7. Create C/C++ DLLs in Visual Studio

    https://docs.microsoft.com/zh-tw/cpp/build/dlls-in-visual-cpp?view=vs-2019 Walkthrough: Create and u ...

  8. TCP协议的11种状态及其变化过程?传输的内容又是什么?

    在TCP的11种状态变迁中,我们需要用到TCP头部的三个标志位: 1.SYN,SYN=1表示这是一个连接请求报文或者连接接受报文 2.ACK,ACK=1,表示确认号生效 3.FIN,FIN=1表示发送 ...

  9. [转帖]在 k8s 中自动为域名配置 https

    在 k8s 中自动为域名配置 https https://juejin.im/post/5db8d94be51d4529f73e2833 随着 web 的发展,https 对于现代网站来说是必不可少的 ...

  10. linux命令kill和kill -9的区别

    linux命令kill和kill -9的区别 2018年04月13日 16:53:07 坠入苦海销尘垢 阅读数 2854   转载自https://www.cnblogs.com/liuhouhou/ ...