python调试

问题并没有解决,只是做个记录。

1、生成coredump文件

echo “ulimit -c unlimited” >> /etc/profile

然后记得敲入命令

source /etc/profile

然后敲入命令:

ulimit –c

确认能否生成coredump文件,使用如下命令(使用时注意,我在测的时候会直接退出当前用户)

kill -s SIGSEGV $$

然后回到执行上述命令的路径下即可看到coredump文件,我这边生成的文件名为core.3477,依个人会随机生成不同的数字。
ulimit -c 可以设置core文件的大小,如果这个值为0.则不会产生core文件,这个值太小,则core文件也不会产生,因为core文件一般都比较大。

使用ulimit -c unlimited来设置无限大,则任意情况下都会产生core文件。

可以通过修改/etc/profile文件:来永久设置文件大小和文件名和存储位,在文件末尾添加:
ulimit -c unlimited

Installing python3-dbg and python3-dev:

$ sudo apt install python3-dbg python3-dev

python3-dbg package comes with short documentation how to use it in /usr/share/doc/python3-dbg/README.debug which I will use in the next step.

Appending unpacked GDB helper script /usr/share/doc/python3.5/gdbinit.gz to ~/.gdbinit:

zcat /usr/share/doc/python3.5/gdbinit.gz >> ~/.gdbinit

刚开始参考这个How can I get python stack trace information using GDB?
结果libpython 之类的都找不到,py-bt找不到

[gdb的python接口](https://segmentfault.com/a/1190000005718889)

<如何在virtualenv中使用gdb python调试扩展>
我已经通过在gdb上使用strace解决了这个问题,并打开了“open”系统调用。 >

似乎gdb在它猜测的几个路径(根据python二进制文件)中搜索python-gdb.py,并且只要没有找到该文件,它就会失败。

最终解决问题的方法是将 /usr/lib/debug/usr/bin/python2.7-gdb.py 放入env的bin目录中。链接的名称应该是< python二进制名称> -gdb.py ,在我的情况下 python2.7-dbg-gdb.py (…)

如何修改core file的文件名格式和保存位置
/proc/sys/kernel /core_pattern可以控制core文件保存位置和文件名格式。可通过以下命令修改此文件:

echo “/corefile/core-%e-%p-%t” >/proc/sys/kernel /core_pattern

可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名

官方教程 中文 英文

How to change the Python Interpreter that gdb uses?

1
2
3
4
5
6
$ apt-get -qq update
$ apt-get install gdb python2.7-dbg python3-all-dbg
$ gdb -ex r -ex quit --args python2 -c "import sys ; print(sys.version)" # Py2.7
$ gdb -ex r -ex quit --args python3 -c "import sys ; print(sys.version)" # Py3.6

Debugging of CPython processes with gdb

2018-06-01 centos 7.x 版本下用gdb 调试 python3.6.3 解释器
使用 gdb 调试运行中的 Python 进程

载入libpython脚本

如果你的gdb是redhat或fedora等厂商修改过的,会有--python选项,使用此选项即可指定gdb启动时载入的Python扩展脚本(此脚本是扩展gdb的,不是我们需要debug的脚本)。

$ gdb --python /path/to/libpython .py -p 1000
如果安装的是GNU的gdb,就需要打开gdb后手动载入libpython.py脚本

(gdb) python
> import sys
>sys.path.insert(0, '/path/to/libpython.py' )
> import libpython
>end
(gdb)

下载libpython Debugging Python C/C++ extensions in gdb

一个可视化的工具GDB dashboard

Python-Debugging
gdb调试python运行中的进程:在stackoverflow一个帖子上找到了灵感,其实就是用含有调试符号的python来运行脚本,也就是用python-dbg或者python2.7-dbg来运行py脚本程序

gdb 与 Python 集成

坚持原创技术分享,您的支持将鼓励我继续创作!