Linux下C/C++的gdb工具与Python的pdb工具常见用法之对比

本文详细介绍了GDB(GNUDebugger)和Python内置的PDB调试工具,包括它们的功能、安装方法,以及两者之间的命令执行差异和常用参数。通过C++和Python示例展示了如何在实际开发中使用这些工具进行调试。
摘要由CSDN通过智能技术生成

1、gdb和pdb分别是什么?

1.1、gdb

GDB(GNU Debugger)是一个功能强大的命令行调试工具,由GNU项目开发,用于调试C、C++等编程语言的程序。它在多个操作系统中都可以使用,包括Linux、MacOS和Windows(通过MinGW或Cygwin)。GDB提供了一系列命令和功能,使得开发者能够在程序执行过程中跟踪、检查和修改程序的状态。这可以帮助开发者诊断和解决程序中的问题。

1.2、pdb

Pdb是Python的内置调试工具,它是一个交互式的源代码调试器,可以用于调试Python程序。它提供了一个命令行界面,让开发者能够在程序执行过程中跟踪、检查和修改变量的值,以及设置断点、单步执行代码等操作。Pdb的使用非常灵活,可以在程序运行时手动介入,也可以在程序出现异常时自动进入调试模式。它还支持多线程和远程调试等功能,因此在Python开发中得到了广泛的应用。pdb是Python开发中非常有用的调试工具,它可以帮助开发者快速定位和解决问题。

2、安装方式

本部分分别列举在绝大多数情况下,在红帽系和debian系Linux的安装方式,以下方式并不代表所有的Linux都适用,如果以下安装方式不适用,可以考虑源码编译安装:

2.1、安装gdb

红帽系Linux:yum install gdb
debian系Linux:apt install gdb

2.2、安装pdb

跟随Python基础环境自带,无需安装

3、gdb与pdb命令执行差异对比

gdbpdb
gdb <C/C++编译后生成的运行文件名>python3 -m pdb <Python脚本文件名>

4、gdb与pdb常用命令参数

4.1、gdb

run或r:开始调试代码,并运行到第一个断点处,所以我们在开始调试前需要设置断点
n:运行到下一行代码
s:若当前代码行为调用一个函数,则进入函数中
b func_name/num:在某个函数或者某一行打上断点
break info:把所有的断点信息打出来
p name:把某个变量的值打出来,若全局变量和局部变量存在相同的变量,则根据当前作用域打印对应变量
set name = num:在不改变源程序的情况下,改变某个变量的值
c:在已经run的情况下,直接跳转到下一个断点处
set args:传参进行相应的调试
info break:查看所有的断点

4.2、pdb

p param:打印变量或者直接使用变量名
n:执行下一行,不进入函数体
s:进入函数体
r:执行到当前函数结束
a:在函数中时打印函数的参数和参数的值
c:继续执行至下一个断点
q:退出调试
l :查看当前位置前后11行代码
ll:查看当前函数的所有代码
w:打印堆栈信息,最新的帧在最底部
enter:重复上一条命令
b:显示目前所有断点
b linenum:在指定行设置断点
b filename:linenum:在指定文件的指定行设置断点
cl linenum:清楚指定断点
cl:清除所有断点

5、gdb和pdb工具的使用示例

5.1、gdb使用示例

C++示例代码如下:

#include <iostream>
using namespace std;
class testFunction{
public:
        testFunction(){
                cout << "以下是一个循环测试!" << endl;
                for(int i = 0;i < 10;i++){
                        cout << "这是第" << i << "次循环!" << endl;
                };
        };

        void function1(){
                cout << "这是function函数" << endl;
        };
};
int main(int argc, char * argv[]){
        cout << "以下是上述测试类的实例化!" << endl;
        testFunction tF;
        tF.function1();
        cout << "以下是gdb传参测试结果:" << endl;
        for (int i = 0; i < argc; i++){
                cout << "参数值:" << argv[i] << endl;
        };
        return 0;
};

在这里插入图片描述
【注:使用g++编译C++代码或者使用gcc编译C代码时,需要在编译命令行中带-g参数以允许通过gdb调试】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2、Python使用示例

Python代码如下:

import sys

class testFunction(object):
    def __init__(self):
        print('这是一个循环测试!')
        for i in range(0, 10):
            print('这是第' + str(i) + '次循环!')

    def function1(self):
        print('这是function函数')

if __name__ == '__main__':
    print('以下是上述测试类的实例化!')
    tF = testFunction()
    tF.function1()
    print('以下是pdb传参测试结果')
    for i in range(0,len(sys.argv)):
        print('参数值:' + sys.argv[i])

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、其他事项

本文仅对gdb和pdb的常用参数进行举例,gdb和pdb的用法远不局限于本文,具体可根据实际的使用需求查阅相关文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值