GDB基础调试万字教程:帶你一起深入淺出GDB調試(建议搜藏)

Posted 鸿渐之翼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GDB基础调试万字教程:帶你一起深入淺出GDB調試(建议搜藏)相关的知识,希望对你有一定的参考价值。

博主:鴻漸之翼
个人介绍:男,搞底層的FW,喜歡發一點沒用的東西。

前言:

介紹部分純屬節目效果勿噴

本篇文章將簡單介紹GDB、GDB使用方法,與GDB挿件使用方法。
感謝臺灣科技大學NTUSTISC

GDB ???

GDB常用指令
b(break point)
c (continue)
ni (next)直接运行下一条指令
si (continue to function)逐步运行指令,遇见函数有限运行函数里的
GDB demo
gdb file
b *main 在main()函数位置打下断点
disas main查看main函数的反汇编指令
x/8g 看stack 8byte的空间
x/s 看字符串
x/1xg 0x000055555555551b0
x/8xg

基础命令:

我们通过一个demo来简单说明下GDB调试流程

开始调试:

gdb test

然后查看main的汇编

disas main 

如果我们要查看main,就下一个break pointer在main

b *main 或者 b main

现在你掌握了最基本的gdb调试技巧,我们通过一个实例进行调试程序如下

#include <stdio.h>
int func()
{
    int i=0; int j=0;
    for(i=0;i<10;i++)
    {
        j+=2;
        printf("i=%d\\n",i);
        printf("j=%d\\n",j);
    }
    return 0;
}
int main()
{
    int i=1;
    i = i + 1;
    printf("func= %s, line= %d,i= %d\\n",__FUNCTION__,__LINE__,i);
    func();
    i++;
    printf("func= %s,;line= %d,i= %d\\n",__FUNCTION__,__LINE__,i);
    return 0;
}

使用gcc命令编译生成可执行文件
gdb_test名字是自定义的可以更改

gcc gdb.c -g -o gdb_test


现在你已经学会最简单的编译程序技巧。
接下来有两种使用gdb调试的方式。
第一种方式是“gdb+可执行程序”

第二种方式是“进入gdb再使用file命令载入文件”

你可以选在自己喜欢的方式进行尝试
目前为止你已经学会了如何载入程序,下面是调试环节
首先需要我们在gdb中运行程序,使用run命令把程序以GDB形式运行。

(1)输入run命令

(2)查看源码:list+function list+行数

(3)查看函数反汇编:disassemble+函数名

使用c退出
(5)程序断点相关操作
5.1程序行断点
b gdb.c:3
5.2函数断点
b gdb.c:func
5.3条件表达式断点
break 18 if i===2

如果想让程序继续执行,使用命令c,如果想让程序进入调用函数内部,使用s,如果想退出程序使用命令q。


(6)disable enable delete 断点命令
disable break n:禁用某个断点n
enable break n: 开启某断点n
delete break:删除所有断点
delete break n:删除某个断点
clear 行号:删除某一行断点
clear 函数名:删除该函数断点
info breakpoints:查看系统中设置的所有断点

(7)变量、内存相关的操作

查看内存中变量: p 变量名
查看内存地中中存储的值:
x/<n/f/u> 其中 n、f、u是参数
f表示格式:
x/x :按照十六进制格式显示变量
xd:按照十进制格式显示变量
x/u:按十六进制格式显示无符号整形
x/o:按照八进制格式显示变量
x/t:按照二进制格式显示变量
x/c:按字符格式显示变量
x/f:按浮点数格式显示变量
u参数表示从当前地址往后请求字节数,
b是单字节,h是双字节,w是4字节,g是8字节
例如:
x/2bh 0x1234 从addr 0x1234 以十六机制的方式显示2个单字节的长度。

打印变量值 p i
继续执行 c
由于执行过 i = i+1,所以变量i变成了2
x/2un &i 输出变量i的地址,默认是以16进制输出4字节
x/4uw &i 输出变量i的地址,默认是以10进制输出4个4字节

(8)查看并且修改变量类型与值:
what is <变量名>
set var <变量名>=<新设置的变量值>

以上是关于GDB基础调试万字教程:帶你一起深入淺出GDB調試(建议搜藏)的主要内容,如果未能解决你的问题,请参考以下文章

GDB调试器教程

C/C++ - Codeblocks 调试 MinGW GDB STL (查看容器数据)配置教程(完整版)

如何使 GDB 与外部程序一起工作

深入了解PHP:用gdb调试源码

gdb调试程序函数名为问号,啥原因?

linux c/c++ GDB教程详解(转载)