0%

周谈(3)- python调试

前言

在工作中,每周都会遇到一些问题,这些问题在大家工作中可能会有许多共性,于我也是一种经验的积累小结。我觉得花一些时间整理一下,跟粉丝读者们分享一下日常工作遇到的问题,这是一个很好的互动和文章分享的痛点。

这是第三篇, 下面看问题。

python调试

刚开始定位问题的时候,如果python程序的进程挂住了或者是coredump了,使用gdb进行调试,只能通过bt看到c函数的调用栈,没有办法看到python对应的代码,问题的定位比较困难。

然后就到gdb官网上去看了,是可以支持调试python的。

https://sourceware.org/gdb/current/onlinedocs/gdb/Python.html#Python

首先编译gdb的时候,需要带上–with-python,才能够支持调试python。

如何进行gdb调试python, 可以参考python官网的文章
https://wiki.python.org/moin/DebuggingWithGdb

文章指出,有些python难以调试的bug需要使用到gdb,分别是:

  • 段错误(未捕获到python异常)
  • 进程挂住(无法获取调用栈)
  • 不可控的daemon进程

然后需要安装python-debuginfo库,否则会读不到python的符号表。

最后使用命令 gdb attach 就可以开始调试python程序了。

怎么进行调试也有文档
https://fedoraproject.org/wiki/Features/EasierPythonDebugging

这个问题就讲这么多,最终使用py-bt可以看到python代码的调用栈,也就可以很轻松的看到问题了。

更多

这一周,要处理的问题比较多,还需要完成之前欠下的文档,就在周六发文了。

项目首轮内测快结束了,测试组开始性能压测了,那些个开源代码和商业源代码都抵挡不住败下阵来了,有程序死锁的问题,也有程序coredump的问题,还有就是执行慢的性能问题。根据coredump定位出了好几个异常分支,释放野指针的问题,基本上都是函数返回值未判断,变量未初始化导致的。这些问题,在正常的处理流程中不易暴露,但是在极端情况下,比如内存耗尽,CPU满载的时候,很容易就复现了。所以编码习惯很重要,如果在编码的时候,养成了习惯,对返回值进行了判断处理,变量都进行了初始化,那么程序将天生健壮。

当然,开源程序和商业代码也都是程序员贡献的,有问题也是正常的。毕竟人家很多是利用业余时间完成的,还有很多代码也是经验尚浅的人写的,或者是出于应用场景的局限有不同的考量。

遇到问题,解决就是了。

在定位问题的过程中,还是用top、perf等工具,后面整理了,​再来分享。

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。