使用gdb调试Python脚本
成都创新互联公司2013年成立,是专业互联网技术服务公司,拥有项目成都网站制作、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元嘉荫做网站,已为上家服务,为嘉荫各地企业和个人服务,联系电话:13518219792
我们在实际调试python脚本中一般可以用记录log和python本身自带的pdb,当然这是在一般的情况下,以下的文章就会提出一些运用log和python本身自带的pdb却不能解决的相关情况的相关介绍。 但凡事总有例外,在以下三种情况时上述方法就无能为力了。
1 段错误
2 运行中的daemon程序
3 core dump
这个时候就需祭出gdb进行调试。python2.6的源码中提供了部分预定义函数以便大家使用gdb调试,我们只需将文件Python-2.6/Misc/gdbinit所包括的内容加入到用户目录下的.gdbinit文件中即可,这样每次启动gdb时会自动完成这些宏的定义。但可惜的是Python2.6.2 gdbini对于pylocals的定义居然有错误, 看来是没有随着代码的更新而同步更新。
我们只需将
- while $_i < f->f_nlocals
修改为
- while $_i < f->f_code->co_nlocals
即可。文章后面所附的几个宏建议也加入的.gdbinit文件中,更多的宏可参考我们首先需要构造一个会造成段错误的python脚本。老实说让python发生段错误并不容易,但通过其外部调用库就很简单了。我们将该文件命名为gdb_test.py
- import sys, os, libxml2
- def segv_test():
- s = ""
- options = libxml2.HTML_PARSE_RECOVER + \
- libxml2.HTML_PARSE_NOERROR + \
- libxml2.HTML_PARSE_NOWARNING
- doc = libxml2.htmlReadDoc(s, None, 'utf-8', options).doc
- ctxt = doc.xpathNewContext()
- nodes = ctxt.xpathEval('//body/node()')
- nodes.reverse()
- for note in nodes:
- nexts = note.xpathEval('node()')
- note.unlinkNode()
- note.freeNode()
freeNode会将该节点及其子节点释放掉
- nexts[0].unlinkNode()
- nexts[0].freeNode()
资源已经释放,再次释放会造成段错误
- def main():
- segv_test()
- if __name__ == "__main__":
- main()
使用gdb运行该脚本,我们会得到段错误信息。
- gdb python
- r gdb_test.py
- *** glibc detected *** double free or corruption
(fasttop): 0x08104570 ***- Program received signal SIGABRT, Aborted.
- [Switching to Thread -1208260928 (LWP 26159)]
- 0x00b987a2 in _dl_sysinfo_int80 () from /
lib/ld-linux.so.2
以上就是对使用gdb调试Python脚本相关的内容的介绍,望你会有所收获。
【编辑推荐】
文章标题:Python脚本在使用gdb调试时常会遇到的三个“克星”
转载来于:http://www.gawzjz.com/qtweb/news23/205773.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联