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命令执行差异对比
gdb | pdb |
---|---|
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 sysclass 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的用法远不局限于本文,具体可根据实际的使用需求查阅相关文档。