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. Java笔试面试题整理第七波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 1.super的作用     在Java中su ...

  2. linux命令行抓取网页快照

    linux命令行抓取网页快照-(xvfb+CutyCapt)   目的: 在一台没有安装X-server的Debian服务器上实现命令行抓取网页快照 软件: xvfb(在命令行下实现对X-server ...

  3. Mysql相关问题集锦

    1:连接阿里云的服务器时,用navicate连接SSH时提示:或提示指到另一个IP从而进不去. SSH:expected key exchange group packet form server 解 ...

  4. centos7下 nginx配置upstream 不能直接代理到本机tomcat的解决

    Nginx代理本地tomcat时404. upstream是直接配置server localhost:10000 的.单独访问tomcat是可以的. 查看/var/log/nginx/error.lo ...

  5. Mesh属性[Unity]

    Mesh属性[Unity] Mesh是Unity内的一个组件,称为网格组件.3D网格是Unity中最重要的图形元素.在Unity中存在多种组件用于渲染标准网格或者蒙皮网格.拖尾或者3D线条. 在Uni ...

  6. 接口自动化测试链接https://www.cnblogs.com/finer/

    https://www.cnblogs.com/finer/ 测试框架的基本原则:业务逻辑与测试脚本分离,测试脚本与测试数据分离: 接口自动化的两种方式:工具(jmeter).代码(使用的是pytho ...

  7. 关于 web 页面 占满全屏

    页面一般可以分成三部分,头部,底部,中间内容部分. 一般不用考虑中间高度部分,因为可以靠内容撑开,然后让底部到达底部.但是当中间内容太少时,底部就会顶不到底部. 方法1.中间部分给一个最小高度(min ...

  8. Object.assign()怎么用?

    用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). 1.以对象为参数的合并1)Object.assign方法的第一个参数是目标对象,后面的参数都是源对象 con ...

  9. cdnbest如何在站点里开启强制缓存

    在站点设置中如下图设置: 强制缓存有两种方式,一种是文件类型,一种是url方式

  10. NSLog无法使用

    iOS/macos 中 #import<foundation/foundation.h> nslog不能用 如果项目中包含c/c++程序代码 将其后缀修改成.m .mm 将项目的build ...