Python——pdb 断点调试

pdb是一个基于命令行的调试工具,只需要引入内置的pdb模块,并运行set_trace函数就可以触发调试器。通常将这两个操作写在一行中便于将其注释。

import pdb;pdb.set_trace()
命令简写命令作用
breakb设置断点
continuec继续执行程序,直到下一个断点或调用点
listl查看当前行的代码段
steps进入函数
returnr执行代码直到从当前函数返回
quitq中止并退出
nextn执行下一行
printp打印变量的值
helph帮助
argsa查看传入参数
回车重复上一条命令
breakb显示所有断点
break linenob lineno 在指定行设置断点
break file:linenob file:lineno在指定文件的行设置断点\
clear num删除指定断点
bt查看函数调用栈帧
### 设置和使用断点PythonPDB 调试器中,可以采用多种方法来设置和移除断点。当通过命令行启动 PDB 并希望以非侵入的方式调试 `net_tools.py` 文件时,可以在不修改源码的情况下利用命令行参数指定要打断点的位置。 对于想要针对具体文件如 `net_tools.py` 设定断点的情况,在命令行输入如下指令可实现: ```bash python3 -m pdb net_tools.py ``` 一旦进入了 PDB 控制台环境之后,就可以使用 `breakpoint()` 或者缩写形式 `b` 来创建新的断点了[^1]。例如,如果想在一个特定的函数内部停止执行,则需要知道该函数所在的模块以及其名称;假设目标是在名为 `connect_to_network` 函数处暂停程序流,那么应该这样操作: ```plaintext (Pdb) b net_tools.connect_to_network Breakpoint 1 at /path/to/net_tools.py:line_number_of_connect_to_network_definition ``` 这会在每次调用此函数之前触发中断并允许进一步检查变量状态或单步执行语句[^2]。 为了更精确地控制何时何处停下来看一看发生了什么,还可以附加条件表达式给这些断点——只有满足一定条件下才会激活它们。比如只在网络连接失败的时候才停下来分析原因: ```plaintext (Pdb) cond 1 'not connected' Condition set for Breakpoint 1. ``` 这里的 `cond` 命令后面跟着的是先前设定好的断点编号(这里是第1号),紧接着就是作为判断依据的一段逻辑测试字符串[^3]。 最后,若是要删除某个已有的断点,只需简单地键入相应的编号即可清除它;而全部清空则可以用 `clear all` 完成这一任务[^4]。 ### 进入函数内部 为了让调试过程更加高效深入到感兴趣的代码片段里去,除了上述提到的方法外,也可以直接定位至某一行代码上设立临时性的停靠点。假如已经知道了确切的目标位置,可以直接这样做: ```plaintext (Pdb) b filename.py:linenumber ``` 其中 `filename.py` 是指含有待检视部分的那个脚本的名字,而 `linenumber` 则代表那一行的具体号码。这种方式特别适用于那些由其他地方间接调用但又确实是我们关心的重点区域内的子程序或是处理流程。 #### 示例:进入 `net_tools.py` 中的函数 考虑这样一个场景,即打算探究位于 `net_tools.py` 内部叫做 `scan_ports` 的功能块的行为模式。此时应当采取下面的操作序列: ```plaintext (Pdb) b net_tools.scan_ports ... (Pdb) c # 继续直到遇到刚才设下的那个断点 --Call-- > /full/path/to/net_tools.py(XX)scan_ports() -> def scan_ports(): (Pdb) ``` 现在就已经成功抵达了所期望的地方,并准备好了对接下来发生的事情展开细致观察。 ```python def connect_to_network(host, port): """尝试建立网络连接""" try: socket.create_connection((host, port)) print(f"Connected to {host}:{port}") except Exception as e: print(e) def scan_ports(target_ip): """扫描一系列端口的状态""" ports = range(70, 86) open_ports = [] for p in ports: result = connect_to_network(target_ip, p) if not isinstance(result, str): # 如果不是异常信息说明连上了 open_ports.append(p) return open_ports ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值