给网站做插画分辨率,无水印logo免费一键生成,免费咨询眼科医生回答在线,做网站外快gdb调试python进程的前提条件
安装python及python调试信息安装gdb工具安装python-gdb.py扩展
安装过程
我们使用docker来安装以上内容#xff0c;Dockerfile文件内容如下#xff1a;
FROM docker.io/centos:7.4.1708# 安装依赖
RUN yum install -y -q epel-release …gdb调试python进程的前提条件
安装python及python调试信息安装gdb工具安装python-gdb.py扩展
安装过程
我们使用docker来安装以上内容Dockerfile文件内容如下
FROM docker.io/centos:7.4.1708# 安装依赖
RUN yum install -y -q epel-release \yum install -y -q gcc zlib zlib-devel libffi libffi-devel make openssl-devel openssl11 openssl11-devel# 下载python源码包并解压
RUN curl -fSL https://mirrors.huaweicloud.com/python/3.11.2/Python-3.11.2.tgz -o python.tgz \tar -zxf python.tgz# 编译安装python包含python调试信息
RUN cd Python-3.11.2 \export CPPFLAGS-I/usr/include/openssl11 export LDFLAGS-L/usr/lib64/openssl11 \./configure --prefix/usr/python \make -j $(nproc) python \make install# 创建软链接将python命令指向Python 3.11.2
RUN ln -sf /usr/python/bin/python3 /usr/bin/python \ln -sf /usr/python/bin/pip3 /usr/bin/pip \sed -i 1s/^.*$/#!\/usr\/bin\/python2.7/ /usr/bin/yum \sed -i 1s/^.*$/#!\/usr\/bin\/python2.7/ /usr/libexec/urlgrabber-ext-down# 安装gdb工具
RUN yum install -y -q centos-release-scl \yum install -y -q devtoolset-9-gdb \ln -s /opt/rh/devtoolset-9/root/usr/bin/gdb /usr/bin/gdb# 进入gdb时自动执行python-gdb.py
RUN sed -i s/, encodingutf-8// /Python-3.11.2/python-gdb.py \echo source /Python-3.11.2/python-gdb.py /root/.gdbinit构建命令
docker build -t python-gdb:1.0 .测试
准备测试环境
# 运行容器
docker run --name python-gdb-test --cap-add sys_ptrace -itd python-gdb:1.0
# 进入容器
docker exec -it python-gdb-test bash
# 写一个测试脚本script.py
echo from time import sleep
while True:print(aa)sleep(1) script.py
# 后台运行
nohup python script.py a.log 21
# 查看进程号
ps -ef | grep pytho[n] | awk {print $2}使用gdb调试python进程
[root4d607f8672d7 /]# gdb
(gdb) attach 29
(gdb) py-bt
Traceback (most recent call first):File //script.py, line 4, in modulesleep(1)
(gdb) py-list1 from time import sleep2 while True:3 print(aa)4 sleep(1)到这里就测试成功了。
下面列一下gdb调试python进程的一些常用命令
bt # 当前C调用栈
py-bt # 当前Python调用栈
py-bt-full # 输出Python调用栈
py-up # 上一帧py级别的帧
py-down # 下一帧py级别的帧
py-list # 当前py代码位置
py-locals # 输出locals变量
py-print var # 输出指定变量
info thread # 线程信息
thread id # 切换到某个线程
thread apply all py-list # 查看所有线程的python代码位置
quit # 中断踩坑记录
源码编译python时make命令带有LDFLAGS-Wl,–strip-all参数会删除调试信息要保留调试信息的话不要带这个参数直接使用yum install gdb安装的gdb工具版本过低使用时会报错需要从SCL源来安装更新版本的GDBgdb使用python2.7来执行python-gdb.py会报错把python-gdb.py脚本中open(filename, ‘r’, encoding“utf-8”)中的encoding参数去掉就可以正常执行了docker容器默认情况不允许使用系统ptrace会导致gdb使用报错运行容器时增加–cap-add sys_ptrace参数来关闭ptrace限制
参考
使用 GDB 调试 C API 扩展和 CPython 内部代码 — Python 3.11.8 文档 Docker不能使用gdb调试的解决方案