摘自:https://www.cnblogs.com/xuejiale/p/10788379.html

一、整体大纲

二、gdb调试

1. 启动gdb

start -- 只执行一步
    n -- next
    s -- step(单步) -- 可以进入到函数体内部
    c - continue -- 直接停在断点的位置

2. 查看代码

l -- list
    l 10(函数名)
    l filename:行号(函数名)

3. 设置断点

设置当前文件断点:
    b -- break
    b 10(函数名)
    b fileName:行号(函数名)
    设置指定文件断点
                
    设置条件断点:
    b 10 if value==19
    删除断点:
    delete -- del - d
    d 断点的编号
    获取编号: info -- i
    info b

4. 查看设置的断点

5. 开始执行gdb调试

执行一步操作
     继续执行
     执行多步, 直接停在断点处

6. 单步调试

进入函数体内部:s
     从函数体内部跳出:finish
     不进入函数体内部:n
     退出当前循环:u

7. 查看变量的值: p -- print

8. 查看变量的类型: ptype 变量名

9. 设置变量的值:set var 变量名 = 赋值

10. 设置追踪变量

display
       取消追踪变量
       undisplay 编号
       获取编号: info display

11. 退出gdb调试
       quit

三、gdb详解

1. 简介
       GDB(GNU Debugger)是GCC的调试工具。其功能强大,现描述如下:

GDB主要帮忙你完成下面四个方面的功能:

1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2)可让被调试的程序在你所指定的调置的断点处停住(断点可以是条件表达式)。

3)当程序被停住时,可以检查此时你的程序中所发生的事。

4)动态的改变你程序的执行环境。

2. 生成调试信息

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

gcc -g hello.c -o hello

g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。

3. 启动GDB 的方法

gdb program

program 也就是你的执行文件,一般在当前目录下。

4. 程序运行上下文

1)程序运行参数

set args 可指定运行时参数。(如:set args 10 20 30 40 50 )

show args 命令可以查看设置好的运行参数。

run  启动程序

2)工作目录

cd 相当于shell的cd命令。

pwd 显示当前的所在目录。

5. 设置断点

1) 简单断点

break 设置断点,可以简写为b

b 10 设置断点,在源程序第10行

b func 设置断点,在func函数入口处

2) 多文件设置断点

在进入指定函数时停住:

C++中可以使用class::function或function(type,type)格式来指定函数名。如果有名称空间,可以使用namespace::class::function或者function(type,type)格式来指定函数名。

break filename:linenum -- 在源文件filename的linenum行处停住

break filename:function -- 在源文件filename的function函数的入口处停住

break class::function或function(type,type) -- 在类class的function函数的入口处停住

break namespace::class::function -- 在名称空间为namespace的类class的function函数的入口处停住

3) 查询所有断点

info b

6. 条件断点

一般来说,为断点设置一个条件,我们使用if关键词,后面跟其断点条件。

设置一个条件断点

b test.c:8 if intValue = 5

7. 维护停止点

delete [range...] 删除指定的断点,如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。

比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。

disable  [range...]

disable所指定的停止点,如果什么都不指定,表示disable所有的停止点。简写命令是dis.

enable [range...]

enable所指定的停止点,如果什么都不指定,表示enable所有的停止点。简写命令是ena.

8. 调试代码

run 运行程序,可简写为r

next 单步跟踪,函数调用当作一条简单语句执行,可简写为n

step 单步跟踪,函数调进入被调用函数体内,可简写为s

finish 退出进入的函数

until 在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u。

continue 继续运行程序,可简写为c

9. 查看运行时数据

print 打印变量、字符串、表达式等的值,可简写为p

p count 打印count的值

10. 自动显示

你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。

display 变量名

info display -- 查看display设置的自动显示的信息。

undisplay num(info display时显示的编号)

delete display dnums… -- 删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)

disable display dnums…

enable display dnums…

disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。

11. 查看修改变量的值

(gdb) ptype width -- 查看变量width的类型

type = double

(gdb) p width  -- 打印变量width 的值

$4 = 13

你可以使用set var命令来告诉GDB,width不是你GDB的参数,而是程序的变量名,如:

(gdb) set var width=47

在你改变程序变量取值时,最好都使用set var格式的GDB命令。

12. 显示源代码

GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上 –g 的参数,把源程序信息编译到执行文件中。不然就看不到源程序了。当程序停下来以后,

GDB会报告程序停在了那个文件的第几行上。你可以用list命令来打印程序的源代码。默认打印10行,还是来看一看查看源代码的GDB命令吧。

list linenum

Print lines centered around line number linenum in the current source file.

list function

显示函数名为function的函数的源程序。

list

显示当前行后面的源程序。

list -

显示当前行前面的源程序。

一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。

set listsize count

设置一次显示源代码的行数。(unless the list argument explicitly specifies some other number)

show listsize

查看当前listsize的设置。

GDB基本命令总结:

基本命令1

 基本命令2

 基本命令3

Linux C编程之五 gdb调试的更多相关文章

  1. Yuchuan_Linux_C编程之五gdb调试

    一.整体大纲 二.gdb调试 1. 启动gdb start -- 只执行一步    n -- next    s -- step(单步) -- 可以进入到函数体内部    c - continue - ...

  2. Linux基础 30分钟GDB调试快速突破

    引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...

  3. linux下如何使用gdb调试

    gdb是linux下非常好用的一个调试工具,虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,这里简单介绍下gdb下常用的命令. 首先编译生成可执行文件(这里的test.c是一个简单的求前n ...

  4. Linux高级编程--04.GDB调试程序(入门概述)

    GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试 ...

  5. Linux高级编程--04.GDB调试程序(查看数据)

    查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用 ...

  6. linux c编程:gdb的使用

    首先用一个简单的打印字符的程序来做下示例 #include<stdio.h>#include<string.h>void main(){    int i=0;    char ...

  7. Linux多任务编程之五:exit()和_exit()函数(转)

    来源:CSDN  作者:王文松   转自:Linux公社 ----------------------------------------------------------------------- ...

  8. Linux C编程(2) dgb调试

    1. 首先编写一个用于调试的测试程序test.c #include <stdio.h> int get_sum(int n) { ,i; ; i <=n ; i++) { sum+= ...

  9. Linux高级编程--04.GDB调试程序(设置断点)

    调试已运行的程序 在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序. 先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程 ...

  10. VS2017创建Linux项目实现远程GDB调试

    vs2017新增linux for C++的模块,尝试安装了一下环境. 首先,安装VS2017,安装时注意选择以下模块: 安装完成后,需要配置Linux服务端的部分,我的配置过程如下: 第一步,安装V ...

随机推荐

  1. http协议中长连接和短连接介绍

      TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,客户端与服务器端之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时可以释放这个连接.连接的建立依靠"三次握手& ...

  2. 2023人形全能赛竞速机器人mega代码

    mega // @Author : Hcm #include <LobotServoController.h> // 舵机板通信 #include <OneButton.h> ...

  3. 深入浅出容器学习--Docker数据卷

    一.Docker数据卷 Docker镜像是由多个文件系统(只读层)叠加而成,当启动一个容器的时候,Docker会加载只读镜像层并在其上(镜像栈顶部)添加一个读写层.如果运行中的容器修改了现有的一个已经 ...

  4. 阿里微服务解决方案-Alibaba Cloud之服务消费方(Feign)(四)

    一.创建服务消费方并集成OpenFeign 创建模块的方式与创建服务提供方的方式一致 目录结构如下 1.1 创建完项目后,加入 OpenFeign的依赖 在父工程的 pom.xml 文件中加入如下依赖 ...

  5. ArkUI-X在Android平台动态化开发指南

    本文介绍如何在Android平台进行ArkUI-X动态化开发,包括动态化目录规则及约束. 适用场景 动态化主要包括两个典型场景: 场景1:框架动态化,为了降低应用ROM体积占用,及满足动态升级框架目的 ...

  6. Vue.js作者谈:Vue 3 最新进展_VueConf 2018

    本文只是针对视频内容的重点整理,如若不清楚的地方请看文末链接的现场视频内容. Vue3.0会带来些什么: 更快 更小 更易于维护 更好的多端渲染支持 其他新功能 更快: 重构虚拟DOM:更多虚拟时的优 ...

  7. UFT VBScripts sharing

  8. redis可视化管理客户端和数据备份

    在我的印象中,redis的客户端都是一些命令行. 不过前一阵子,使用了yunedit-redis这个图形化管理的客户端,就再也不想使用命令行了.它不仅能图形化管理redis的数据,还可以在客户端做数据 ...

  9. 利用DNSLOG测试XXE漏洞(BWAPP为例)

    以BWAPP为例,测试XXE漏洞,用DNSLOG作回显. 一.选择XXE漏洞测试,抓包,点击[anybugs?]. 二.获取域名 三.直接上payload 四.查看DNSLOG回显 如有错误,请及时指 ...

  10. laradock下mysql You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYS...

    上图 异常报错 mysql You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_R ...