GDB基础学习

  • 要调试C/C++程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g参数可以做到这一点,比如:
gcc -g test.c -o test

GDB 的命令概貌

使用help命令

  • 通过gdb test启动gdb后,就进入了gdb的调试环境,就可以使用gdb 的命令开始调试程序了,gdb的

    命令可以使用help命令来查看:

  • 这里可以看到help命令只是列出了gdb命令的种类,如果要知道所有的命令可以输入help all,也可以通过help <class>查看种类中的命令,或通过help <command>查看命令的帮助。

  • 比如我们可以通过help breakpoints来查看断点的命令:

  • 『需要注意』:gdb中的命令可以简写,如设置断点的break可以简写为b(当然,命令的前几个字符要标志着唯一的命令);在linux下,可以敲击两次TAB键来补齐命令的 全称,如果有重复的,gdb会把其列出来。比如输入b敲击两次TAB键:

基本命令

命令 解释 示例
List(l) 列出文件的代码清单 (gdb) l
Printf(p) 显示指定变量(临时变量或全局变量)的值。 (gdb) p i
(gdb) p nGlobalVar
Run(r) 运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。 (gdb) r
Continue(c) 继续执行被调试程序,直至下一个断点或程序结束。 (gdb) c
Breakpoint(b) 1.函数断点: 在进入指定函数时停住。
2.行断点:在指定行号停住。
3.条件断点:break ... if ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。
4.临时断点:(tb 行号)
(gdb) b main
(gdb) b 8
(gdb) b if i=100
(gdb) tb 15
Step(s) 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数
相当于其它调试器中的“Step Into (单步跟踪进入)”。
(gdb) s
Next(n) 执行一行源程序代码,此行代码中的函数调用也一并执行;
相当于其它调试器中的“Step Over (单步跟踪)”。
(gdb) n
Info(i) 显示各类信息 (gdb) i r
Backtrace(bt) 打印函数调用堆栈 (gdb) bt
Quit(q) 退出gdb调试 (gdb) q

实例学习

我们用下面的代码来学习:

#include <stdio.h>
int func(int n)
{
int sum=0,i;
for(i=0; i<n; i++)
{
sum+=i; 9 }
return sum;
} main()
{
int i;
long result = 0;
for(i=1; i<=100; i++)
{
result += i;
}
printf("result[1-100] = %d \n", result );
printf("result[1-250] = %d \n", func(250) ); }

首先vim一个test.c,再输入gcc -g test.c -o test进行编译,编译成功后输入gdb test启动gdb进行调试:

输入l列出源码,再敲击回车可以看到所有代码:

接下来在第16行通过b 16设置断点;通过b func在func函数处设置断点,info b可以查看断点信息如图:

输入r运行程序,会停到断点处;再输入n单条语句执行,可以看到循环在一条一条执行;为了快速一点,输入c直接把循环执行完:

我们也可以输入b 16 if i=50来设置条件断点,run之后可以看到程序停到了断点处,此时printf i的值为50:

GDB基础学习的更多相关文章

  1. gcc,gdb基础学习2

    gdb调试: 源文件:test.cc >>g++ -g test.cc -o test.o  这里需要参数-g,因为接下来要使用gdb进行调试,生成目标文件test·o 因为需要将调试信息 ...

  2. gcc,gdb基础学习1

    gcc: (1)gcc -O1 -S code.c   这里的-S可以的到code.c的汇编(只进行了预处理和编译这:两个阶段形成 了汇编代码code·s) (2)gcc -c code.c   这里 ...

  3. GDB基础知识

    GDB 基础知识 GDB 基础知识 一.简介 支持命令补全功能 GDB 的调用与退出 二.GDB 的基本指令 1. run/r 2. break/b 3. info breakpoints 4. de ...

  4. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  5. 如何从零基础学习VR

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...

  6. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  7. HTML5零基础学习Web前端需要知道哪些?

    HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...

  8. python入门到精通[三]:基础学习(2)

    摘要:Python基础学习:列表.元组.字典.函数.序列化.正则.模块. 上一节学习了字符串.流程控制.文件及目录操作,这节介绍下列表.元组.字典.函数.序列化.正则.模块. 1.列表 python中 ...

  9. python入门到精通[二]:基础学习(1)

    摘要:Python基础学习: 注释.字符串操作.用户交互.流程控制.导入模块.文件操作.目录操作. 上一节讲了分别在windows下和linux下的环境配置,这节以linux为例学习基本语法.代码部分 ...

随机推荐

  1. 46.Scrapy框架结构

    Scrapy的介绍:Scrapy是基于Twisted的异步处理框架,是纯python语言实现的爬虫框架,特点是架构清晰,模块间耦合度低.扩展性强较为灵活. 框架结构如图所示: Engine:引擎,处理 ...

  2. 63(原67).纯 CSS 创作单元素点阵 loader

    原文地址:https://segmentfault.com/a/1190000015444368 感想:CSS又一次让我见识到它的强大之处 --> box-shadow . box-shadow ...

  3. maven pom文件

    setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件:而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和li ...

  4. java判断是否是数字

    1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); i++){ ...

  5. vim移动一行或一段代码

    nmap <M-j> mz:m+<cr>`z nmap <M-k> mz:m-2<cr>`z vmap <M-j> :m'>+< ...

  6. Access restriction 问题解决

    最近导入新项目,导入所有用到的jar包,发现其中一个引用报错 import com.sun.istack.internal.Nullable; 具体信息如下: Access restriction: ...

  7. wheel

    http://guoqiao.me/post/2015/1212-pip-install-offline-via-wheels python wheel -r requirements.txt 下载 ...

  8. 吴裕雄 python深度学习与实践(12)

    import tensorflow as tf q = tf.FIFOQueue(,"float32") counter = tf.Variable(0.0) add_op = t ...

  9. python入门(六):函数

    1.系统自带的函数: >>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'B ...

  10. JAVA获取系统信息以及系统时间

    在做测试的时候,经常需要获取系统信息,并且用获取到的系统时间给生成的报告取名字. 以下代码实在TestNG展示的,没有Test NG的话需要些一个main方法. import java.net.Ine ...