1.gcc的-g选项

如果要使用gdb进行调试,必须在编译时在gcc中加入-g选项,使用参数 -g 表示将源代码调试信息编译到可执行文件中。

#include <stdio.h>  

int main(void)
{
int i = ;
i = i + ;
printf("i = %d\n",i);
return ;
}

如果使用-g选项:

gcc -g main.c

$ gdb a.out 
(gdb) b main
Breakpoint 1 at 0x4004fc: file main.c, line 5.
(gdb) r
Starting program: /home/yanwenjie/ctest/a.out 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
Breakpoint 1, main () at main.c:5
5 int i = 1;
(gdb) n
6 i = i + 1;
(gdb) 
7 printf("i = %d\n",i);
(gdb) 
i = 2
8 return 0;
(gdb)

2.上下移动调用栈    //不怎么熟悉,蛮有用的工具

在函数调用期间,与调用关联的运行信息存储在栈帧的内存区域中。帧中包含函数的局部变量的值、其形参,以及调用该函数的
位置记录。每次发生函数调用时,都会创建一个新帧,并将其推到一个系统维护的栈上,栈最上方的帧表示正在执行的函数,当
函数退出时,这个帧被弹出栈,并且被释放。
在GDB中可以用如下命令查看以前的帧:

  frame 1

当执行GDB的frame命令时,当前正在执行的函数的帧被编号为0,其父帧被编号为1,父帧的父帧被编号为2,以此类推。GDB

的up命令将你带到调用帧中的下一个父帧,down则引向相反方向。这样的操作非常有用,因为根据以前的一部分栈帧中的局部
变量的值。
GDB的backtrace命令会显示整个栈,即当前存在的所有帧的集合。
main.c:
#include <stdio.h>  

void display(int i)
{
printf("i = %d\n",i);
} int main(void)
{
int i = ;
i = i + ;
display(i);
return ;
}
对上面的程序进行gdb调试。
(gdb) b display 
Breakpoint 1 at 0x4004ff: file main.c, line 5.
(gdb) frame
No stack.
(gdb) r
Starting program: /home/yanwenjie/ctest/a.out 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
Breakpoint 1, display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) frame
#0  display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) frame 0
#0  display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) frame 1
#1  0x0000000000400535 in main () at main.c:12
12 display(i);
(gdb) frame 0
#0  display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) up
#1  0x0000000000400535 in main () at main.c:12
12 display(i);
(gdb) down
#0  display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb) bt
#0  display (i=2) at main.c:5
#1  0x0000000000400535 in main () at main.c:12
 

3.gdbinit

使用gdb调试程序的时候,有时候需要设定多个断点,重复执行某些操作,而这些操作写起来比较麻烦,这时候可以使用gdbinit脚本。

如下脚本:

#filename: .gdbinit
file a.out
b display
r

有两种方式来使用这个脚本:

1)启动gdb时候
gdb在启动的时候,会在当前目录下查找".gdbinit"这个文件,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为".gdbinit",

这样在启动的时候就会处理这些命令。

将脚本保存为.gdbinit,放在main.c同一目录下,执行gdb命令:

$ gdb

Breakpoint 1, display (i=2) at main.c:5

5 printf("i = %d\n",i);
(gdb) 

2)gdb运行期间
可以使用 source script-file 来解释gdb命令脚本script-file

将脚本保存为gdbscript,放在main.c同一目录下:

$ gdb
(gdb) source gdbscript 
Breakpoint 1 at 0x4004ff: file main.c, line 5.
Breakpoint 1, display (i=2) at main.c:5
5 printf("i = %d\n",i);
(gdb)

gdb 预备知识的更多相关文章

  1. 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识

    驱动开发读书笔记. 0.06  嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...

  2. 受限玻尔兹曼机(RBM)学习笔记(一)预备知识

    去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算法原 ...

  3. 学习Identity Server 4的预备知识

    我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...

  4. JAVA面向对象-----面向对象(基础预备知识汇总)

    终于整理好了面向对象基础预备知识,但是有点多,所以你们懂的,贴图,较长的代码我还是会排版出来的,我不想把时间浪费在排版上在word里排版一次已经很浪费时间了,所以请谅解. public class C ...

  5. 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目

    上一部分预备知识在这 http://www.cnblogs.com/cgzl/p/9010978.html 如果您对ASP.NET Core很了解的话,可以不看本文, 本文基本都是官方文档的内容. A ...

  6. ASP.NET Core的实时库: SignalR -- 预备知识

    大纲 本系列会分为2-3篇文章. 第一篇介绍SignalR的预备知识和原理 然后会介绍SignalR和如何在ASP.NET Core里使用SignalR. 本文的目录如下: 实时Web简述 Long ...

  7. 学习Identity Server 4的预备知识 (误删, 重补)

    我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...

  8. LDA-线性判别分析(一)预备知识

    本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...

  9. IP地址和子网划分学习笔记之《预备知识:进制计数》

    一.序:IP地址和子网划分学习笔记开篇 只要记住你的名字,不管你在世界的哪个地方,我一定会去见你.——新海诚 电影<你的名字> 在我们的日常生活中,每个人的名字对应一个唯一的身(敏)份(感 ...

随机推荐

  1. Java常用函数式接口--Supplier接口使用案例

    使用案例:

  2. 动态script标签同步加载 ps:无打包编译,静态实现静态资源入口动态配置,无编译打包静态资源添加版本号

    /**功能:创建动态标签加载css ,js文件,重点是js文件,利用onloading加递归实现动态标签的同步加载用法:在html文件body底部script内部声明并调用下列函数,obj中写要加载的 ...

  3. X86驱动:恢复SSDT内核钩子

    SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用 ...

  4. PHP Math函数

    abs() 绝对值.   acos() 反余弦.   acosh() 反双曲余弦.   asin() 反正弦.   asinh() 反双曲正弦.   atan() 反正切.   atan2() 两个参 ...

  5. 通过 Kubeadm 安装 K8S 与高可用,版本1.13.4

    环境介绍: CentOS: 7.6 Docker: 18.06.1-ce Kubernetes: 1.13.4 Kuberadm: 1.13.4 Kuberlet: 1.13.4 Kuberctl: ...

  6. SVN_06导入项目文档

    把这个项目的文档迁入到SVN Server上的库中 [1]首先右键点击projectAdmin目录,这时候的右键菜单例如以下图看到的:选择copy URL toCLipboard,就是复制统一资源定位 ...

  7. 【转】JRE和JDK的区别

    用一幅图来宏观的看一下 从图中可以看出JDK包含JRE包含JVM. JDK:java development kit (java开发工具) JRE:java runtime environment ( ...

  8. jupyter修改默认目录

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10841241.html 一.修改 win10 ...

  9. ChibiOS/RT移植到STM32F407

    官网地址:http://www.chibios.org/dokuwiki/doku.php 下载源码 找到STM32F407的demos程序(chibios\demos\STM32\RT-STM32F ...

  10. 运维开发笔记整理-Request对象与Response对象

    运维开发笔记整理-Request对象与HttpResponse对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.request对象 1>.什么是request 首先,我 ...