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

使用 ipdb 调试回调函数

一、问题概述

回调函数是指一个函数执行完后,调用另外一个函数的过程。
一般步骤是,回调函数作为参数传递给原始函数,原始函数执行完自己的逻辑后,自动调用回调函数并将自己的执行结果作为参数传递给回调函数。
根据不同的用法,回调函数可能在主线程/进程中,也可能在其他线程/进程中。有时候,这会给调试回调函数带来一点麻烦,比如,在回调函数内打的断点,在调试模式下死活无法触发。(是的,在pycharm中遇到这个情况的就是我。。。)

这时,为了能正常调试,可以考虑以下方法:
1、如果回调函数是普通函数,或者普通的类,可以先不作为回调函数使用,而是先当成普通函数来正常调试,确认其中的逻辑没问题, 再按回调函数的用法来调用。
2、不使用 pycharm 中内置的调试功能,使用 ipdb(window) 或者 pudb(linux)来调试。

第1点比较简单,以下介绍一下第 2 点中如何使用 ipdb 来调试回调函数。

二、ipdb 调试回调函数

1、ipdb是什么

pdb(python debugger)是一个集成于Python标准库中的交互式无界面调试工具,功能主要包括:
a、断点设置与跳转
b、单步执行代码
c、任意变量查询、值修改(不必重启程序)

pdb 的弱点在于对多线程,远程调试等支持得不够好,没有界面,不太适合大型的 python 项目。

ipdb是增强版的pdb,它提供了更多的功能和更友好的交互界面,使得在开发过程中调试代码变得更加方便。 功能包括:
a、在代码中的任意位置设置断点
b、单步运行语句,并查看其结果
c、可查看当前执行上下文中的变量值
d、可跳过某个函数或循环
e、命令行界面
f、语法tab补全、条件断点、彩色输出等

2、ipdb的安装与常用命令简介
2.1、安装
pip install ipdb
2.2、常用命令简介
! 执行 python 命令,或者显示变量值
ENTER 重复上次命令
a(rgs) 打印当前函数的参数
b(reakpoint) 设置断点
cl(ear) 清除断点
c(ontinue) 运行直到断点位置
h(elp) 帮助信息
j(ump) 让程序跳转到指定的行数
l(ist) 列出想了解的代码,查找当前位置
n(ext) 让程序运行下一行,当前语句有函数/子程序调用也不进入
s(tep) 让程序运行下一行,当前语句有函数/子程序就进入
p(rint) 打印某个变量
q(uit) 退出调试
r(eturn) 继续执行,直到函数体返回
disable/enable 禁用/启用断点
3、ipdb的启动

假设 d:\download\callback_debug.py 需要调试。有两种方式能够对它进行调试:
3.1、在IDE中启动
a、在代码中导入 ipdb 的 set_trace
b、在要调试的行之前插入 set_trace()
c、运行代码,则代码自动在 set_trace() 处停止,等待调试

3.2、在命令行启动

python -m ipdb d:/download/callback_debug.py

方法 3.1 在IDE中执行,会修改源码,并且对循环等的调试支持不是很好,相对来说,方法 3.2 更加灵活一些,但是对多线程、多进程的场景,按方法 3.2,非主进程、主线程上的断点不一定能抓住。
以下主要讨论方法 3.2,但是使用方法也适用于 3.1。

4、举例:以一个调试过程为例
4.0、原始代码
def on_callback(num, num2):a = 1b = '这是一串字符'if num == 3:print('haha')print(f"回调处理后的数字是 {num} * {num} = {num * num}")def foo(num, callback: callable):print(f"当前的数字是:{num}")callback(num, 10)if __name__ == '__main__':for i in range(5):foo(i, on_callback)
4.1、命令行启动 ipdb
(base) D:\xxxx\trial>python -m ipdb callback_debug.py
# 执行结果为:
> d:\xxxx\trial\callback_debug.py(1)<module>()
----> 1 def on_callback(num):2     if num == 3:3         print('haha')ipdb> 

此时自动进入单步执行状态,ipdb 停留在第一行代码处待命。

4.2、查看代码

查看第1行至第10行的代码内容(没有第0行)

ipdb> l 1,10
----> 1 def on_callback(num):2     if num == 3:3         print('haha')4         print(f"回调处理后的数字是 {num} * {num} = {num * num}")5 6 7 def foo(num, callback: callable):8     print(f"当前的数字是:{num}")9     callback(num)10 ipdb> 

ll 是查看整个源码文件

4.3、设置断点

在 on_callback() 函数内设置断点,位置是第4、11行,分别在回调函数、初始函数内。

ipdb> b 4
Breakpoint 1 at d:\xxxx\trial\callback_debug.py:4
ipdb> b 11
Breakpoint 2 at d:\xxxx\trial\callback_debug.py:11
ipdb> 
4.4、运行至断点处

断点2后设置,但是运行逻辑上先运行到。

ipdb> c
当前的数字是:0
> d:\xxxx\trial\callback_debug.py(11)foo()10     print(f"当前的数字是:{num}")
2--> 11     callback(num, 10)12 ipdb> 
4.5、在函数 foo 里,查看都有哪些参数
ipdb> a
num = 0
callback = <function on_callback at 0x0000010B5C856940>
ipdb> 
4.6、进入回调函数内部
ipdb> s
--Call--
> d:\xxxx\trial\callback_debug.py(1)on_callback()
----> 1 def on_callback(num, num2):2     a = 13     b = '这是一串字符'ipdb> 
4.7、连续单步运行

其中第一次单步执行需要输入 n 后再回车,之后2次直接回车即可

ipdb> n
> d:\xxxx\trial\callback_debug.py(2)on_callback()1 def on_callback(num, num2):
----> 2     a = 13     b = '这是一串字符'ipdb> 
> d:\xxxx\trial\callback_debug.py(3)on_callback()2     a = 1
----> 3     b = '这是一串字符'
1     4     if num == 3:ipdb>
> d:\xxxx\trial\callback_debug.py(4)on_callback()3     b = '这是一串字符'
1---> 4     if num == 3:5         print('haha')ipdb> 
4.8、跳出、跳入回调函数,并查看入参与变量值
ipdb> u
> d:\xxxx\trial\callback_debug.py(11)foo()10     print(f"当前的数字是:{num}")
2--> 11     callback(num, 10)12 ipdb> d
> d:\xxxx\trial\callback_debug.py(4)on_callback()3     b = '这是一串字符'
1---> 4     if num == 3:5         print('haha')ipdb> args
num = 0
num2 = 10
ipdb>p num
2
ipdb> num
2
ipdb> 
4.9、跳转到指定行(必须与跳转之前位置在同一个函数内)
> d:\xxxx\trial\callback_debug.py(2)on_callback()1 def on_callback(num, num2):
----> 2     a = 13     b = '这是一串字符'ipdb> j 4
> d:\xxxx\trial\callback_debug.py(4)on_callback()3     b = '这是一串字符'
1---> 4     if num == 3:5         print('haha')ipdb> 
4.10、取消第一个断点并执行代码至第2个断点处
ipdb> cl 1
Deleted breakpoint 1 at d:\xxxx\trial\callback_debug.py:4
ipdb> c
当前的数字是:2
> d:\xxxx\trial\callback_debug.py(11)foo()10     print(f"当前的数字是:{num}")
2--> 11     callback(num, 10)12 ipdb> 
4.11、显示当前所处的位置以及堆栈信息
ipdb> wd:\anaconda3\lib\bdb.py(580)run()579         try:
--> 580             exec(cmd, globals, locals)581         except BdbQuit:<string>(1)<module>()d:\xxxx\trial\callback_debug.py(16)<module>()14 if __name__ == '__main__':15     for i in range(5):
---> 16         foo(i, on_callback)> d:\xxxx\trial\callback_debug.py(11)foo()10     print(f"当前的数字是:{num}")
2--> 11     callback(num, 10)12ipdb> 
4.12、退出调试
ipdb> q(base) D:\xxxx\trial>

三、参考资料

1、pdb调试神器使用终极指南
2、pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明

相关文章:

使用 ipdb 调试回调函数

一、问题概述 回调函数是指一个函数执行完后&#xff0c;调用另外一个函数的过程。 一般步骤是&#xff0c;回调函数作为参数传递给原始函数&#xff0c;原始函数执行完自己的逻辑后&#xff0c;自动调用回调函数并将自己的执行结果作为参数传递给回调函数。 根据不同的用法&a…...

介绍一下mybatis的基本配置(mybatis-config.xml)

src/main/resources/mybatis-config.xml 这句代码&#xff0c;是XML的声明&#xff0c;它指定了&#xff0c;XML的版本 和 编码方式 <?xml version"1.0" encoding"UTF-8" ?>这句代码&#xff0c;声明了XML文档类型&#xff0c;它告诉解析器&#x…...

【MySQL】第一次作业

【MySQL】第一次作业 1、在官网下载安装包2、解压安装包&#xff0c;创建一个dev_soft文件夹&#xff0c;解压到里面。3、创建一个数据库db_classes4、创建一行表db_hero5、将四大名著中的常见人物插入这个英雄表 写一篇博客&#xff0c;在window系统安装MySQL将本机的MySQL一定…...

10个免费视频素材网站,剪辑师们赶紧收藏!

剪辑师们不知道去哪里找免费视频素材&#xff0c;就上这10个网站&#xff0c;免费下载部分还可商用&#xff0c;赶紧收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但除了设计类素材之外还有很多…...

【毕业设计】基于SSM的运动用品商城的设计与实现

1.项目介绍 在这个日益数字化和信息化的时代&#xff0c;随着人们购物习惯的转变&#xff0c;传统的实体商店已经无法满足人们日益增长的在线购物需求。因此&#xff0c;基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的运动用品商城项目应运而生&#xff0…...

【Web】CTFSHOW 中期测评刷题记录(1)

目录 web486 web487 web488 web489 web490 web491 web492 web493 web494 web495 web496 web497 web498 web499 web500 web501 web502 web503 web505 web506 web507 web508 web509 web510 web486 扫目录 初始界面尝试文件包含index.php&am…...

vs配置cplex12.10

1.创建c空项目 2.修改运行环境 为release以及x64 3.创建cpp文件 4.鼠标右键点击项目中的属性 5.点击c/c&#xff0c;点击第一项常规&#xff0c;配置附加库目录 5.添加文件索引&#xff0c;主要用于把路径导进来 6.这一步要添加的目录与你安装的cplex的目录有关系 F:\program…...

Kubernetes 弃用Docker后 Kubelet切换到Containerd

containerd 是一个高级容器运行时&#xff0c;又名 容器管理器。简单来说&#xff0c;它是一个守护进程&#xff0c;在单个主机上管理完整的容器生命周期&#xff1a;创建、启动、停止容器、拉取和存储镜像、配置挂载、网络等。 containerd 旨在轻松嵌入到更大的系统中。Docke…...

函数模板含有多个模板参数

如果一个模板接受多个参数&#xff0c;用逗号分隔参数。 使用时必要情况下需要主动传入模板参数。 #include <iostream> #include <vector>/* Compute the greatest common divisor of two integers, using Euclids algorithm. */ template<class T, class U&g…...

Sprd Android 13 增加系统属性判断当前有无 OTG U盘插入,App 读取系统属性

添加系统属性,通过监听插拔广播判断当前有无OTG U盘插入 --- a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -246,6 +246,7 @@ …...

第11章 数据库技术(第一部分)

一、数据库技术术语 &#xff08;一&#xff09;术语 1、数据 数据描述事物的符号描述一个对象所用的标识&#xff0c;可以文字、图形、图像、语言等等 2、信息 现实世界对事物状态变化的反馈。可感知、可存储、可加工、可再生。数据是信息的表现形式和载体&#xff0c;信…...

数据结构––队列

1.队列的定义 2.队列的分类 2.1循环队 2.2链式队 3.队列的实现 3.1循环队 3.1.1声明 typedef int QDataType; #define MAXSIZE 50 //定义元素的最大个数 /*循环队列的顺序存储结构*/ typedef struct {QDataType *data;int front; //头指针int rear; //尾指针 }Queue;…...

010_redhat安装zookeeper

目录 1.环境准备2.下载上传zookeeper安装包1)[官网下载zookeeper-3.6.4安装包](https://archive.apache.org/dist/zookeeper/zookeeper-3.6.4/apache-zookeeper-3.6.4-bin.tar.gz)2)创建soft文件夹 3.解压4.配置启动1、配置zoo.cfg2、启动zookeeper 小结 1.环境准备 准备一台l…...

【网络】gateway 可以提供的一些功能之一 “ 提供web静态资源服务 ”

gateway 可以提供的一些功能之一 “ 提供web静态资源服务 ” 一、提供web静态资源服务1.1、web静态资源服务是什么1.2、web静态资源服务有什么作用1.3、web静态资源服务怎么实现 二、提供Restful服务器路由转发三、支持Eureka服务发现四、服务检查五、灰度发布 一、提供web静态…...

MySQL第一次作业

解压完安装包 以管理员进入命令行 初始化并记住初始随机密码 创建服务名称 启动mysql 使用随机密码登录 修改密码 退出并重登服务器 MySQL创建数据库和表 创建数据库 创建表 1.进入数据库 创建表 向表中插入数据...

详解LLMOps,将DevOps用于大语言模型开发

大家好&#xff0c;在机器学习领域&#xff0c;随着技术的不断发展&#xff0c;将大型语言模型&#xff08;LLMs&#xff09;集成到商业产品中已成为一种趋势&#xff0c;同时也带来了许多挑战。为了有效应对这些挑战&#xff0c;数据科学家们转向了一种新型的DevOps实践LLM-OP…...

牛客NC275 和为S的两个数字【简单 map C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b 思路 map参考答案C #include <vector> class Solution {public:vector<int> FindNumbersWithSum(vector<int> array, int sum) {vector<int> ans;m…...

ax200/ax201/ax210/ax211/ax411等intel网卡无法开启5G热点问题解决方案汇总

目录 故障原因解决方案windowslinuxkernel < 5.5kernel > 5.5方案1 修改linux内核模块代码&#xff08;iwlwifi内核模块&#xff09;&#xff0c;重新编译内核模块并重新导入方案2 修改hostapd代码 最后更新于2024.04.28 故障原因 根本原因是因为英特尔在内核中开启了LA…...

JVM的垃圾回收机制(GC机制)

在Java代码运行的过程中&#xff0c;JVM发现 某些资源不需要再使用的时候&#xff0c;就会自动把资源所占的内存给回收掉&#xff0c;就不需要程序员自行操作了。“自动回收资源”就是JVM的“垃圾回收机制”&#xff0c;“垃圾回收机制”也称"GC机制"。 对于Java代码…...

分布式光伏管理系统和一般的光伏管理系统相比有什么区别?

随着全球对可再生能源的关注度日益提高&#xff0c;光伏技术作为其中的佼佼者&#xff0c;已经得到了广泛的应用。在光伏技术中&#xff0c;管理系统扮演着至关重要的角色&#xff0c;它关乎着光伏电站的运行效率、能源产出以及运维成本等多个方面。其中&#xff0c;分布式光伏…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...