前言
在工作中,每周都会遇到一些问题,这些问题在大家工作中可能会有许多共性,于我也是一种经验的积累小结。我觉得花一些时间整理一下,跟粉丝读者们分享一下日常工作遇到的问题,这是一个很好的互动和文章分享的痛点。
这是第三篇, 下面看问题。
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
怎么进行调试也有文档https://fedoraproject.org/wiki/Features/EasierPythonDebugging
这个问题就讲这么多,最终使用py-bt可以看到python代码的调用栈,也就可以很轻松的看到问题了。
更多
这一周,要处理的问题比较多,还需要完成之前欠下的文档,就在周六发文了。
项目首轮内测快结束了,测试组开始性能压测了,那些个开源代码和商业源代码都抵挡不住败下阵来了,有程序死锁的问题,也有程序coredump的问题,还有就是执行慢的性能问题。根据coredump定位出了好几个异常分支,释放野指针的问题,基本上都是函数返回值未判断,变量未初始化导致的。这些问题,在正常的处理流程中不易暴露,但是在极端情况下,比如内存耗尽,CPU满载的时候,很容易就复现了。所以编码习惯很重要,如果在编码的时候,养成了习惯,对返回值进行了判断处理,变量都进行了初始化,那么程序将天生健壮。
当然,开源程序和商业代码也都是程序员贡献的,有问题也是正常的。毕竟人家很多是利用业余时间完成的,还有很多代码也是经验尚浅的人写的,或者是出于应用场景的局限有不同的考量。
遇到问题,解决就是了。
在定位问题的过程中,还是用top、perf等工具,后面整理了,再来分享。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。