自学内容网 自学内容网

gdb - 调试工具 - 入门 (一)

GDB(GNU Debugger)是GNU项目调试器的缩写,它是Linux下一个强大的C/C++(以及其他语言如Fortran)程序调试工具。以下是对GDB的详细解释:

一、GDB的功能

GDB允许开发者对程序执行进行深入控制,可以检查程序在运行时的内部状态,如变量的值、内存状态、调用栈情况等。它提供了一系列的命令来帮助开发者控制程序的执行流程、检查程序状态、修改程序的行为等。具体来说,GDB具有以下主要功能:

  1. 设置断点:开发者可以在程序的特定位置设置断点,当程序运行到这些位置时,GDB会暂停程序的执行,以便开发者进行调试。
  2. 单步调试:GDB允许开发者逐行执行程序,以便观察程序在每一步的执行情况。
  3. 查看变量的值:开发者可以在GDB中查看程序中变量的当前值,以便了解程序的内部状态。
  4. 动态改变程序的执行环境:GDB允许开发者在程序运行时动态地改变程序的执行环境,如修改变量的值、改变程序的输入等。

二、GDB的常用命令

GDB提供了丰富的命令集,以下是一些常用的命令:

  1. run(或start):启动程序。默认情况下,run指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则run指令会执行程序至第一个断点处。start指令会执行程序至main()主函数的起始位置,即在main()函数的第一行语句处停止执行。
  2. break(或b):设置断点。开发者可以在程序的特定位置设置断点,以便在程序运行到这些位置时暂停执行。
  3. step(或s):单步执行程序。如果当前行调用了函数,则进入函数内部。
  4. next(或n):单步执行程序,但不进入函数内部。
  5. info args:显示当前函数的参数。
  6. watch:设置监视点,用于监视程序中变量的值何时发生变化。当设置的变量值发生变化时,程序执行会暂停。
  7. delete:删除指定编号的断点或监视点。
  8. disable:禁用指定编号的断点或监视点,而不是完全删除它。
  9. enable:重新启用之前禁用的断点或监视点。

三、GDB的使用场景

GDB主要用于C/C++等编程语言的程序调试。它可以帮助开发者在程序执行过程中查找和修复错误,提高程序的稳定性和可靠性。同时,GDB也是学习C/C++等编程语言的重要工具之一,通过调试程序,开发者可以更加深入地理解程序的执行流程和内部机制。

综上所述,GDB是一个功能强大的程序调试工具,它提供了丰富的命令集和强大的调试功能,是C/C++等编程语言开发者不可或缺的工具之一。

四、GDB调试单个程序

示例程序,一个简单的插入排序算法c++

#include<iostream>

void fastsort(int *a,int size){

  

     for (int i = 0; i < size; i++)

     {  

        int min = a[i],min_index=i;

        for (int j = i; j < size-1; j++)

        {

            if (a[j+1] < min)

            {

                min = a[j+1];

                min_index = j+1;

            }

        }

        a[min_index] = a[i];

        a[i] = min;

     }

  

         for (int i = 0; i < size; i++)

    {

        std::cout <<a[i]<< std::endl;

    }

}

  
  
  

int main(int argc, char const *argv[])

{

    int a[] = {3,2,3,4,5,9,8,1,2,5,6};

    // std::cout <<sizeof a /sizeof(int)<< std::endl;

    fastsort(a,sizeof(a)/sizeof(int) +1);

  
    return 0;

}

加入-g

如果要使用gdb进行调试,首先编译命令中要加入-g 将调试信息加入可执行文件中

g++ -g -o fastsort fastsort.c++

然后使用gdb打开可执行文件,gdb fastsort进入gdb调试界面
在这里插入图片描述

l

使用l可以打印出源代码(gdb 默认打印10行)
在这里插入图片描述

如果源代码放在其他地方
(1). 使用如下命令查看目标文件中保存的是相对路径还是绝对路径
readelf -p .debug_str target_bin_file

(2). 如果是相对路径:
使用 gdb 的dir命令添加的源码搜索路径

(3). 如果是绝对路径:
进行路径重新映射:set substitute-path old_path new_path

b

我们可以使用b打上断点

在这里插入图片描述

当程序运行到这个断点时会停止(cpu陷入指令)

r

打完断点后,需要让程序运行起来,使用r
在这里插入图片描述

可以看到我们的程序在40行停了下来

n

如果我们想让程序在断点后,单步运行,则使用n
在这里插入图片描述

可以看到我们又在48行听了下来

c

如果有多个断点,在上个断点后可以使用c,让程序继续运行到下个断点中
![[Pasted image 20241121172545.png]]


原文地址:https://blog.csdn.net/weixin_46325250/article/details/143950826

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!