Python脚本在使用gdb调试时常会遇到的三个“克星”

开发 后端
熟话说不怕一万,就怕万一,在使用gdb调试Python脚本的实际操作步骤中,有几种情况是我们很难解决的。例如段错误,在运行中的daemon的相关程序,等

使用gdb调试Python脚本

我们在实际调试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的定义居然有错误, 看来是没有随着代码的更新而同步更新。

我们只需将

  1. while $_i < f->f_nlocals 

修改为

  1. while $_i < f->f_code->co_nlocals 

即可。文章后面所附的几个宏建议也加入的.gdbinit文件中,更多的宏可参考我们首先需要构造一个会造成段错误的python脚本。老实说让python发生段错误并不容易,但通过其外部调用库就很简单了。我们将该文件命名为gdb_test.py

  1. import sys, os, libxml2  
  2. def segv_test():  
  3. s = "<html><body><div><a><a></a></a><a></a></div></body></html>" 
  4. options = libxml2.HTML_PARSE_RECOVER + \  
  5. libxml2.HTML_PARSE_NOERROR + \  
  6. libxml2.HTML_PARSE_NOWARNING  
  7. doc = libxml2.htmlReadDoc(s, None, 'utf-8', options).doc  
  8. ctxt = doc.xpathNewContext()  
  9. nodes = ctxt.xpathEval('//body/node()')  
  10. nodes.reverse()  
  11. for note in nodes:  
  12. nexts = note.xpathEval('node()')  
  13. note.unlinkNode()   
  14. note.freeNode()  

 freeNode会将该节点及其子节点释放掉

  1. nexts[0].unlinkNode()   
  2. nexts[0].freeNode()  

资源已经释放,再次释放会造成段错误

 

  1. def main():  
  2. segv_test()  
  3. if __name__ == "__main__":  
  4. main()  

 

使用gdb运行该脚本,我们会得到段错误信息。

  1. gdb python  
  2. r gdb_test.py  
  3. *** glibc detected *** double free or corruption 
    (fasttop): 0x08104570 ***  
  4. Program received signal SIGABRT, Aborted.  
  5. [Switching to Thread -1208260928 (LWP 26159)]  
  6. 0x00b987a2 in _dl_sysinfo_int80 () from /
    lib/ld-linux.so.2  
     

 

 以上就是对使用gdb调试Python脚本相关的内容的介绍,望你会有所收获。

【编辑推荐】

  1. Python编写shell脚本中常用的文件介绍
  2. 用Python编写shell脚本时经常使用的函数的介绍
  3. 用Python脚本转换成windows的可执行程序简介
  4. Python入门用Bug修改和.jam文件需要注意的问题
  5. 搭建Python Web环境所需要的相关步骤介绍
责任编辑:佚名 来源: 博客园
相关推荐

2020-07-27 13:49:47

Python编程语言开发

2019-10-09 17:12:16

PythonLinuxWindows

2017-02-06 18:42:37

Linuxgdb程序

2021-03-15 06:23:40

GDB调试代码编程语言

2015-08-14 09:21:09

gdb工具调试 Go

2024-09-05 13:02:41

2022-10-13 15:31:32

Python软件工程编码

2012-05-27 18:24:12

苹果

2018-03-13 12:31:21

2021-10-13 06:59:03

Python技巧编程

2021-07-28 08:53:53

GoGDB调试

2022-12-19 10:10:07

GDB命令

2023-04-26 11:14:11

IT领导者远程工作

2024-01-09 15:37:46

2022-06-30 09:01:00

嵌入式软件技巧

2012-11-19 10:32:07

路由器ConsoleIP地址

2009-08-06 11:00:19

C#对象的使用

2020-06-11 09:00:27

SDN网络架构网络

2019-04-30 09:40:41

Windows 10技巧Windows

2017-12-25 13:58:23

匿名函数普通函数代码
点赞
收藏

51CTO技术栈公众号