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. 1.MVC基础-初识MVC,与WebForm比较

    1.Net WebForm的开发模式

  2. 【转载】C#中将字符串分割成字符数组

    在C#中字符串类型String是由一系列的单个字符组合而成,其实可以通过字符串String对象ToCharArray()方法来将字符串中的元素逐一存在数据类型为Char的一维数组中. 例如将字符str ...

  3. HANA数据库无法停止

    Symptom: 使用命令HDB stop多次,每次报错为timeout ----------------------- sdpadm@PRDDB01:/usr/sap/SDP/HDB66/prder ...

  4. SVN上传本地项目到服务器

    1. 在服务器新建一个文件夹目录: 2. 将新建的目录在本地check out下来: 3. 将自己的项目拷贝到check out下来的文件夹下: 4. 右键点击svnàAdd,选择所有添加: 5. 右 ...

  5. js几种数组排序及sort的实现

    给出以下数组,并进行排序处理 var arr = new Array('1','3','8','2','3','5'); 1. 插入法排序 Array.prototype.csSort = funct ...

  6. Vue-resoure 实现get post jsonp请求

    1.之前学习中,如何发起数据请求? 2.常见的数据请求类型?get post jsonp 3.常见的URL请求资源地址 get请求地址:  http://vue.studyit.io/api/getl ...

  7. Apache日志轮询Cronolog安装及简单用法

    安装日志轮询工具cronolog: [root@bqh- tools]# tar xf cronolog-.tar.gz [root@bqh- tools]# cd cronolog- [root@b ...

  8. lucene初探

    http://www.cnblogs.com/xing901022/p/3933675.html

  9. SQL SERVER-数据库备份及记录

    --完整备份 BACKUP DATABASE JINWEI TO DISK='D:\BAK\JINWEIFULL.bak' --日志备份 BACKUP LOG JINWEI TO DISK='D:\B ...

  10. Django之form表单详解

    构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=" ...