再用 `print` 进行 Python调试,你就OUT啦!

转自:数据STUDIO

👇我的小册 AI工具100个实战小案例:(100个AI工具实战小案例) ,原价299,限时早鸟价29,满100人涨10元。

在Python开发实践中,调试是一个不可或缺的环节。如果采用print()语句来追踪程序执行流程,可能会遇到一个持续出现的异常情况,并且经过多次代码审查问题的根源仍然难以确定,这可能是因为随着终端输出信息的不断增加,这种调试方式的局限性逐渐显现。本文将介绍IceCream库,这个专门用于调试的工具显著提升了调试效率,使整个过程更加系统化和规范化。

print()作为Python中最基础的输出函数,是大多数开发者的首选调试工具。但在处理复杂的函数调用和数据结构时,这种方法往往会导致输出信息混乱,降低调试效率。IceCream库的ic()函数则专门针对调试场景进行了优化,提供了更多实用的功能特性。

基础调试示例 - 使用print

def add(x, y):  
     return x + y  
   
 # 使用print()进行函数调试  
 print(add(10, 20))  # Output: 30  
 print(add(30, 40))  # Output: 70

这种传统方法的主要问题在于:当输出结果较多时,很难直观地将输出值与对应的函数调用关联起来,需要手动添加额外的说明信息。

使用ic进行调试

from icecream import ic  
   
 # 使用ic()进行函数调试  
 ic(add(10, 20))  
 ic(add(30, 40))

输出结果:

ic| add(10, 20): 30  
 ic| add(30, 40): 70

通过使用ic()函数,每个输出都清晰地显示了函数调用的完整信息,包括函数名、参数值和返回结果。这种输出格式特别适合于调试复杂的函数调用序列,能够快速定位问题所在。

ic函数的核心优势

1. 详细的执行信息追踪

ic()函数不仅展示执行结果,还能完整记录操作过程,省去了手动编写调试信息的工作,提高了调试效率。

def multiply(a, b):  
     return a * b  
   
 ic(multiply(5, 5))

输出结果:

ic| multiply(5, 5): 25

2. 调试与赋值操作的集成

ic()函数的一个显著特点是支持同时进行调试和变量赋值,这是传统print()函数所不具备的功能:

# print()方式
 result = print(multiply(4, 6))  # Output: 24  
 print(result)  # Output: None  
   
 # ic()方式  
 result = ic(multiply(4, 6))  # Output: ic| multiply(4, 6): 24  
 print(result)  # Output: 24

使用ic()函数时,不仅可以查看调试信息,还能正确获取并存储返回值,这在调试过程中特别有用。

3. 数据结构访问的可视化

在处理字典等数据结构时,ic()函数能够提供更清晰的访问信息:

data = {'a': 1, 'b': 2, 'c': 3}  
   
 # 使用ic()跟踪数据访问  
 ic(data['a'])

输出结果:

ic| data['a']: 1

输出信息明确显示了访问路径和结果,有助于理解数据操作过程。

4. 复杂数据结构的展示优化

在处理嵌套字典或JSON等复杂数据结构时,ic()函数通过结构化的格式提供了更好的可读性:

complex_data = {  
     "name": "John",  
     "age": 30,  
     "languages": ["Python", "JavaScript"]  
 }  
   
 ic(complex_data)

输出采用了带有颜色区分的结构化格式,极大地提升了复杂数据结构的可读性,便于快速定位和分析数据。

IceCream库的高级特性

除了基本的调试功能外,IceCream库还提供了一系列高级特性,可以根据具体需求定制调试行为:

调试输出的动态控制

在开发过程中,可以根据需要动态控制调试信息的输出:

ic.disable()  # 暂停调试输出  
 ic(multiply(3, 3))  # 此处不会产生输出  
   
 ic.enable()  # 恢复调试输出  
 ic(multiply(3, 3))  # Output: ic| multiply(3, 3): 9

输出格式的自定义配置

IceCream支持自定义输出格式,可以根据项目需求调整输出方式:

def log_to_file(text):  
     with open("debug.log", "a") as f:  
         f.write(text + "\n")  
   
 ic.configureOutput(prefix="DEBUG| ", outputFunction=log_to_file)  
   
 ic(multiply(7, 7))

这种配置可以将调试信息重定向到日志文件,并添加自定义前缀,便于后续的日志分析。

dc05c06299f888cfc5c203bd9418a4c0.jpeg

最后推荐一下我们团队写的AI工具一本通,现在AI工具非常多,我们团队会对AI视频工具,AI数字人,AI写作,AI绘画,AI抠图,AI编程,AI音乐等主流的领域挖掘相关的工具.

欢迎订阅:原价299 现在早鸟价是29,现在是早期小册刚开始写,越早买越划算,还送永久陪伴群。48小时无理由退款,放心食用!满100人 涨10元,有兴趣的可以提前锁定价格!另外我们会送永久陪伴群,(满100人抽1次),包邮送出一些AI书,每本书的价格都是远超这个小册的门票,算是福利大家,感谢大家的支持。

3e8356eba42cd19ab5245a66233fa92c.png

28fb78179578b2e3a5977d8a5f55f5a9.jpeg

有兴趣的同学可以,早点下单,锁定价格,越早买越划算!

aa74fa32e846fc69d2de350eb690ff55.png

### 如何使用Python调试器来调试GDB中的Python脚本 在实际开发过程中,当需要深入分析由底层库引发的崩溃或异常时,可以结合 `gdb` 和 Python调试功能完成复杂的调试任务。以下是关于如何通过 Python 调试器(如 `pdb` 或其他工具)配合 `gdb` 来调试 Python 脚本的具体方法。 #### 1. 配置环境 为了实现这一目标,首先需要确保安装了必要的软件包和依赖项。这通常包括但不限于以下组件: - **GDB**: GNU Debugger 是一个强大的调试工具。 - **Pwntools**: 提供了一些高级接口用于简化调试流程[^2]。 - **Python 开发版本**: 确保使用的 Python 版本支持调试模式(例如启用 `-ggdb` 编译选项)。 可以通过如下方式设置基础运行环境: ```bash sudo apt-get install gdb python2.7-dbg pip pip install --upgrade pwntools ``` #### 2. 启动 GDB 并加载 Python 程序 启动 GDB 并指定要调试的目标文件路径以及附加参数。如果目标是一个 ELF 文件,则可以直接传递给 GDB;如果是解释型语言编写的脚本,则需将其作为输入传入到 Python 解释器中: ```bash gdb -ex r --args /usr/bin/python my_script.py arg1 arg2 ... ``` 此命令会自动进入断点等待状态并允许进一步操作[^1]。 #### 3. 设置断点与单步跟踪 利用 GDB 命令行界面设定特定位置处暂停执行以便观察变量变化情况或者检查错误发生原因。对于嵌套有复杂逻辑结构的应用场景来说尤为重要的是能够精确控制流走向何处停止下来逐一排查潜在隐患所在之处。 常见的一些基本指令包括但不限于以下几个方面: - 添加新断点:`break filename:lineno | functionname` - 删除已有标记:`delete [num]` - 列出当前所有已知障碍物清单列表:`info breakpoints` 另外还可以借助于条件表达式限定满足某些前提条件下才会触发中断动作从而减少不必要的干扰因素影响效率提升整体体验效果更好一点哦😊! 同时也可以考虑引入外部辅助插件扩展原有核心框架之外的功能特性使得整个过程变得更加直观易懂易于管理维护长期来看收益颇丰呢😄! 最后值得注意的一点就是在处理涉及多线程并发访问共享资源的情况下特别容易出现问题所以建议尽早采取预防措施避免后期返工浪费时间精力金钱成本增加项目风险系数上升等问题出现😎! #### 4. 结合 Pwntools 自定义自动化测试用例 除了手动逐条下达各项具体指示外还可尝试编写一段简单的 Python 脚本来批量生成多种不同类型的样本数据集进而快速验证修改后的算法模型是否仍然保持稳定可靠的表现形式不变形走样偏离预期轨迹太远以至于无法接受的程度范围内合理范围之内😉! 下面给出了一段示范性的代码片段展示了怎样利用 Pwntools 中提供的 API 接口轻松创建远程连接对象并与服务器端建立通信链路之后发送请求接收响应解析返回结果等等一系列连续的动作序列组合起来形成完整的业务逻辑链条🔗✨! ```python from pwn import * def debug_with_gdb(target_binary, commands=None): if not isinstance(commands,list):commands=[] io=gdb.debug([target_binary]+sys.argv[1:],gdbscript='\n'.join(commands)) return io if __name__=='__main__': elf_path='./vuln' cmd=['b main','r'] proc=debug_with_gdb(elf_path,cmd) try: while True: line =proc.recvline(timeout=1).decode() if 'flag{'in line : print('Found flag:',line.strip()) break except EOFError as e: pass finally: proc.close() ``` 以上即为一种可行的技术解决方案概述希望能够对你有所帮助解答疑惑困惑引导方向点亮前行之路🌟🎉! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值