首页 > 编程语言 >pdb和gdb的双剑合璧,在python中调试c代码

pdb和gdb的双剑合璧,在python中调试c代码

时间:2024-11-09 16:19:53浏览次数:1  
标签:python 代码 add gdb 双剑合 pdb 调试

左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。
公众号:一点sir,关注领取python编程资料

问题背景

正常情况下,调试python代码用pdb,调试c代码用gdb,而有些python模块是用c语言来实现的,在python中调用了这个c语言实现的模块,而入口又在python这边,那么单独使用pdb或者gdb都是无法完成调试的,这时候调试可能会有一点麻烦,应该需要同时用到pdb和gdb的工具。我们以一个非常简单的例子来说明下pdb和gdb的双剑合璧的调式过程。

例子模拟

假设有一份python代码和c代码,实现一个非常简单的功能。

python代码的文件是example.py,功能是调用了由c实现的sum.so模块

import pdb
import ctypes

# 加载 C 库,假设你已经编译好了 C 代码并生成了名为 sum.so 的库
# 这个只是简单的例子,正常python中调c函数都是通过python.h头文件引入相关方法
libc = ctypes.CDLL('./sum.so')

# Python 代码...
pdb.set_trace()  # 设置断点
result = libc.add_numbers(3, 4)
print(result)
# 后续的 Python 代码...

c代码的文件是example.c,实现了2个数相加,这里只是模拟简单的例子,实际使用的时候一般都是追求效率的计算由c来实现。

int add_numbers(int a, int b) {
    int result = a + b;
    return result;
}

现在假设,只是假设啊,两个数相加的接口出现了异常,也就是函数add_numbers出现了异常,那么就必须要调试一下这个接口,但是这个代码是在python中调用的,也就是入口在python当中,那么这时候就需要先通过pdb,断到出问题函数的前一行代码,例子里采用的是侵入式的断点方式,这里也可以采用非侵入式来断点。

调试过程

在窗口a中执行python代码,代码在断点处停下了

[root@localhost python]# python example.py
> /root/code/python/example.py(10)<module>()
-> result = libc.add_numbers(3, 4)
(Pdb) 

这时候需要另外开一个窗口b,找到刚才的那个python进程

[root@localhost ~]# ps -ef|grep example
root     3129632 3595730  0 19:58 pts/2    00:00:00 python example.py
root     3131806 3131677  0 20:01 pts/3    00:00:00 grep --color=auto example

然后将该进程通过gdb -p载入调试

[root@localhost ~]# gdb -p 3129632

最后在python调用c的入口函数打断点,比如例子中的函数是add_numbers

b add_numbers

接着回到a窗口,让python程序继续执行下去,正常情况下窗口b就可以断到正常断到add_numbers,如果断不到,可能就是相关的debuginfo包没有安装。
然后接可以开始调试c代码了。

以上只是举了个非常简单的例子,实际中可能遇到的情况可能比这个要复杂的多,但是万变不离其宗,基本原理都是相同的。

标签:python,代码,add,gdb,双剑合,pdb,调试
From: https://www.cnblogs.com/kiwiblog/p/18536928

相关文章

  • 批量计算遥感影像NDVI:Python代码
      本文介绍基于Python中的gdal模块,批量基于大量多波段遥感影像文件,计算其每1景图像各自的NDVI数值,并将多景结果依次保存为栅格文件的方法。  如下图所示,现在有大量.tif格式的遥感影像文件,其中均含有红光波段与近红外波段(此外也可以含有其他光谱波段,有没有都不影响);我们希望,批......
  • 【黑马python:函数进阶】81-84
    目录一、函数的多个返回值二、函数的多种传参方式1.函数参数种类1.1位置参数与关键字参数1.2缺省参数1.3不定长参数三、函数作为参数传递四、匿名函数一、函数的多个返回值如果一个函数要有多个返回值,该如何书写代码?按照返回值的顺序,写对应顺序的多个变量接......
  • python+flask计算机毕业设计个人碳足迹系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于碳足迹的研究,现有研究多集中在宏观层面的碳排放总量分析以及企业层面的碳足迹管理等方面。例如,许多研究聚焦于国家或大型企业的碳......
  • python+flask计算机毕业设计好骑行打卡园app系统(程序+开题+论文)
    文件加密系统的设计与实现tp835本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容好骑行打卡园app系统毕业设计相关内容说明一、选题背景随着骑行运动在全球范围内的日益流行,与之相关的数字化服务......
  • Python绘制完整正弦余弦函数曲线
    1,将正弦函数,余弦函数及坐标轴绘制在同一个界面方便对比观察,不同函数的曲线变化importturtle#导入turtle图形库,用于绘图importmath#导入math库,用于数学计算,如三角函数#设置绘图窗口screen=turtle.Screen()screen.title('正弦余弦函数曲线')#设置窗口标题......
  • 基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5
    《------往期经典推荐------》一、AI应用软件开发实战专栏【链接】项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.......
  • 零基础快速掌握python【函数】相关内容及【操作练习】(内附代码)
    1.函数1.1函数的定义函数的定义:实现【特定功能】的代码块。函数的作用:简化代码提高代码重用性便于维护和修改提高代码的可扩展性函数的三要素:功能  len()  max()   sum()参数  s.clear()   s.append('hello')返回值 s.sort()   s1=sor......
  • Python代码文件不只是“.py”
       今天同事给我扔了一个.pyd文件,说让我跑个数据。然后我就傻了。。不知道多少粉丝小伙伴会run.pyd代码文件?如果你也懵懵的,请继续往下读吧。。今天科普下各类Python代码文件的后缀,给各位Python开发“扫扫盲”。.py最常见的Python代码文件后缀名,官方称Python源代码文......
  • Python基础(九):字典
    目录1、字典基础2、键与值的特性3、创建空字典4、访问字典中的值5、修改字典6、删除字典元素7、字典内置函数&方法    在Python的世界里,字典是一种强大的数据结构,它允许我们以键值对的形式存储和检索数据。这种结构不仅灵活,而且功能强大,是处理复杂数据时不可......
  • Python内置函数1详解案例
    1.列表的最值运算描述牛牛给了牛妹一个一串无规则的数字,牛妹将其转换成列表后,使用max和min函数快速的找到了这些数字的最值,你能用Python代码实现一下吗?输入描述:输入一行多个整数,数字之间以空格间隔。输出描述:输出这些数字的zuizhi示例1输入:35691062输出:10......