使用GDB来调试Python里optimized out的问题

首先,贴点网友们的经验:

http://www.cnblogs.com/dkblog/p/3806277.html

https://blog.alswl.com/2013/11/python-gdb/

http://blog.csdn.net/wangzuxi/article/details/42317827

这几个帖子里把基本用法都讲得很明白了。

然而,在现网服务器gdb调试python时,却因为缺少乱七八糟的库而无法分析。

所以,最靠谱的办法是gdb generate-core-file 生成core文件,拖回开发机上面分析。

然后,又因为开发机linux发行版比较特殊,死活装不上python的dbg脚本,于是只能人肉跑去ubuntu里拖过来,放到开发机里。我放了一个修改版的到github里了。

https://gist.github.com/talebook/8958c7f6fc87c08084a47475264de08e

GDB会根据执行程序的路径,自动加载/usr/lib/debug/xxx目录的对应的gdb脚本;我的python是软链到 usr/local/services/python/bin/python2.7.py的,所以脚本要放到这个路径:

/usr/lib/debug/usr/local/services/python/bin/python2.7-gdb.py

环境搞好后,就可以开心地调试python了!

======================================================

…… 然而!

(gdb) py-bt #5 (frame information optimized out) #9 (frame information optimized out)

简直一脸懵逼!

看了下gdb的脚本和python代码,发现虽然f_code参数被优化掉了,但是co参数、freevars参数还在啊,根据python代码里freevars的用法,只要-1, -2, -3地退格使用,就是对应的python代码局部变量指针地址了,so,我依葫芦画瓢搞了个py-vars命令,自动去遍历每个局部变量,然后print出来

(gdb) py-vars [ 0] self = <Server(online_db_table='cdn_host', hosts_info_flush_time=300...(truncated) [ 1] connection = <_socketobject at remote 0x7fd090dbc590> [ 2] address = ('10.121.119.91', 34501) [ 3] queue = <Queue(_writer=<_multiprocessing.Connection ...(truncated) [ 4] t3 = 1500618367.95312 [ 5] t2 = 1500618367.95312 [ 6] t1 = 1500618367.95312 [ 7] t0 = 1500618367.95312 [ 8] recv_data_len = 0 [ 9] recv_data = '1\x84\xe5\x00\x00\x00'

so,搞定!可以尽情去找代码BUG了!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

码农小知识

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Java并发编程,一定要有自己的理解【面试+工作】

编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的...

17770
来自专栏吉浦迅科技

DAY41:阅读Synchronization Functions

waits until all threads in the thread block have reached this point and all glob...

9430
来自专栏谭广健的专栏

devexpress CLR20r3错误记录

好久没写过winform程序了,用devexpress写了个小工具,连一个本地的数据库,感觉不会出什么异常,连接时就没加捕获,调通之后就没管,因为特殊需求,需要...

26140
来自专栏Java架构师进阶

Java 10 新特性全览

在 Java 9 之后,Java 将采用基于时间发布的策略,每 6 个月一个版本。目前,Java 10 的新特性都已经确定。

9640
来自专栏LhWorld哥陪你聊算法

Linux篇---Vi的使用

 1、打开文件 vim /path/to/somefile vim +# :打开文件,并定位于第#行 vim +:打开文件,定位至最后一行 vim +/PAT...

12510
来自专栏不会写文章的程序员不是好厨师

ClassNotFoundException,NoClassDefFoundError,NoSuchMethodError排查

在使用java开发的过程中时常会碰到以上三个错误,其中NoClassDefFoundError、NoSuchMethodError两个error遭遇得会多一些。...

22030
来自专栏信安之路

2017-NSCTF-PWN

这次比赛值得吐槽的地方很多,但是我要忍住,先讲正经的。 这次总结比赛的两道pwn,都是栈溢出类型的,比较简单。先放上题目链接:http://pan.baidu....

10600
来自专栏tkokof 的技术,小趣及杂念

编程小知识之命令行解析

工具链的正常运作往往需要仰仗命令行,各个工具间的“沟通交流”基本都是通过命令行来完成,考虑一下 C 语言中 main 函数的标准定义:

8420
来自专栏葡萄城控件技术团队

Html5 FileReader 对文件进行Base64编码

以Base64进行编码的数据Url开始越来越广泛的被应用起来,原来做Base64转换要自己写一个小程序来转,其实Html5的FileReader的readAsD...

32480
来自专栏FreeBuf

挖洞经验 | 如何在一条UPDATE查询中实现SQL注入

前段时间,我在对Synack漏洞平台上的一个待测试目标进行测试的过程中发现了一个非常有意思的SQL注入漏洞,所以我打算在这篇文章中好好给大家介绍一下这个有趣的漏...

28650

扫码关注云+社区

领取腾讯云代金券