当前位置: 首页 > article >正文

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

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

问题背景

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

例子模拟

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

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

# example.py
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代码了。

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


http://www.kler.cn/a/386365.html

相关文章:

  • Ps:OpenColorIO 设置
  • 【C++学习(37)】并发性模式:如生产者-消费者、读写锁等。 架构模式:如MVC、MVVM等。属于23 种设计模式吗? RAII 的关系?
  • React的基础API介绍(二)
  • JWT深度解析:Java Web中的安全传输与身份验证
  • C++,STL 054(24.11.13)
  • MYSQL 库,表 基本操作
  • [Meachines] [Medium] MonitorsThree SQLI+Cacti-CMS-RCE+Duplicati权限提升
  • 【ESP32+MicroPython】硬件控制基础
  • Python毕业设计-基于 Python flask 的前程无忧招聘可视化系统,Python大数据招聘爬虫可视化分析
  • Flink处理无界数据流
  • TDengine 签约蘑菇物联,改造通用设备工业互联网平台
  • mac端mumu模拟器adb识别不了问题
  • Qt学习笔记(三)网络编程
  • DevExpress中文教程 - 如何使用AI模型检查HTML编辑中的语法?
  • RabbitMQ客户端应用开发实战
  • 一文读懂系列:结合抓包分析,详解SSH协议通信原理
  • Node.js-API 限流与日志优化
  • 【Threejs】相机控制器动画
  • php伪协议介绍
  • 树莓派开发相关知识十 -小试服务器
  • 智能电网能源优化管理系统(Smart Grid Energy Optimization Management System, SGEOMS)
  • jupyter notebook启动和单元格cell
  • java ssm 网上蛋糕店 在线蛋糕甜品管理 网上蛋糕管理 源码 jsp
  • MySQL的约束和三大范式
  • C# NUnit 框架:高效使用指南
  • Spring Boot 集成JWT实现Token验证详解