173、breakpoint() 不止是断点:PYTHONBREAKPOINT 环境变量与自定义调试入口

173、breakpoint() 不止是断点:PYTHONBREAKPOINT 环境变量与自定义调试入口

上周五晚上十一点,线上告警突然炸了。一个跑了三年的数据处理管道,在某个边缘case下直接挂掉,日志里只有一行“Segmentation fault (core dumped)”。我盯着屏幕看了十分钟,脑子里全是问号——Python程序怎么会段错误?C扩展库的锅?内存越界?更麻烦的是,这个bug只在生产环境的特定数据量下复现,本地根本跑不出来。

我第一反应是加pdb.set_trace(),但转念一想,生产环境哪有终端给我交互?而且这个bug涉及多进程,单线程断点根本抓不住。这时候我想起了Python 3.7引入的breakpoint(),以及它背后那个被大多数人忽略的PYTHONBREAKPOINT环境变量。

从pdb.set_trace()到breakpoint()的进化

老派Python开发者应该都写过这样的代码:

importpdb;pdb.set_trace(