当前位置: 首页 > news >正文

在docker容器中使用gdb调试python3.11的进程

gdb调试python进程的前提条件

  1. 安装python及python调试信息
  2. 安装gdb工具
  3. 安装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/, encoding="utf-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 2>&1 &
# 查看进程号
ps -ef | grep pytho[n] | awk '{print $2}'

使用gdb调试python进程

[root@4d607f8672d7 /]# gdb
(gdb) attach 29
(gdb) py-bt
Traceback (most recent call first):File "//script.py", line 4, in <module>sleep(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                     # 中断

踩坑记录

  1. 源码编译python时,make命令带有"LDFLAGS=-Wl,–strip-all"参数会删除调试信息,要保留调试信息的话不要带这个参数
  2. 直接使用yum install gdb安装的gdb工具版本过低,使用时会报错,需要从SCL源来安装更新版本的GDB
  3. gdb使用python2.7来执行python-gdb.py会报错,把python-gdb.py脚本中open(filename, ‘r’, encoding=“utf-8”)中的encoding参数去掉,就可以正常执行了
  4. docker容器默认情况不允许使用系统ptrace,会导致gdb使用报错,运行容器时增加–cap-add sys_ptrace参数来关闭ptrace限制

参考

使用 GDB 调试 C API 扩展和 CPython 内部代码 — Python 3.11.8 文档
Docker不能使用gdb调试的解决方案

相关文章:

在docker容器中使用gdb调试python3.11的进程

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 &…...

堆排序要点和难点以及具体案例应用

堆排序(Heap Sort)是一种基于堆数据结构的排序算法。下面我将以分点表示和归纳的方式,结合相关数字和信息,详细描述堆排序的PTA(Programming and Testing Approach,编程与测试方法)。 1. 堆排序原理 堆排序是一种树形选择排序,利用了完全二叉树的性质,通过构建最大堆…...

pyspark中使用mysql jdbc报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决

报错信息&#xff1a; py4j.protocol.Py4JJavaError: An error occurred while calling o33.load. : java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 我的解决方法&#xff1a; 这个报错就是提示你找不到jar包&#xff0c;所以你需要去下载一个和你mysql版本匹配的j…...

对称加密系统解析

目录​​​​​​​ 1.概述 2. 对称密码类型 3. 对称加密优缺点 4. 对称加密算法 4.1 DES 4.2 3DES 4.3 AES ​​​​​​4.4 SM1 4.5 SM4 1.概述 对称加密&#xff0c;是指在加密和解密时使用同一秘钥的方式。秘钥的传送和保存的保护非常重要&#xff0c;务必不要让秘…...

初识 java 2

1. idea 的调试 1. 点击鼠标左键设置断点 2.运行到断点处 点击 或点击鼠标右键&#xff0c;再点击 使代码运行到断点处&#xff0c;得到 2. 输出到控制台 System.out.println(value);//输出指定的内容&#xff0c;并换行 value 要打印的内容System.out.print(value);…...

云端狂飙:Django项目部署与性能优化的极速之旅

Hello&#xff0c;我是阿佑&#xff0c;这次阿佑将手把手带你亲自踏上Django项目从单机到云端的全过程&#xff0c;以及如何通过Docker实现项目的无缝迁移和扩展。不仅详细介绍了Docker的基本概念和操作&#xff0c;还深入探讨Docker Compose、Swarm和Kubernetes等高级工具的使…...

GDPU JavaWeb 大结局篇(持续更新中)

GDPUJavaWeb程序设计复习&#xff0c;习题集&#xff0c;重点知识总结&#xff0c;一篇就够了。 实验复习 JavaWeb代码复习&#xff0c;在专栏也可查阅。 课后巩固习题 1 【单选题】下列说法正确的是( D ) A、在B/S结构中,结果应用软件发生了改变,就必须通知所有的客户端重新…...

Linux系统信息的查看

目录 前言一、系统环境二、查看系统IP地址信息2.1 ifconfig命令2.2 ip address命令 三、查看系统端口信息3.1 nmap命令3.2 netstat命令 四、查看系统进程信息4.1 ps命令4.2 kill命令 五、查看系统监控信息5.1 top命令5.2 df命令iostat命令5.3 sar命令 总结 前言 本篇文章介绍查…...

LE Audio音频广播新功能Auracast介绍

LE Audio音频广播新功能Auracast介绍 /*! \copyright Copyright (c) 2019-2022 Qualcomm Technologies International, Ltd. All Rights Reserved. Qualcomm Technologies International, Ltd. Confidential and Proprietary. \file audio_sources.h \defgroup audio_so…...

一文学习yolov5 实例分割:从训练到部署

一文学习yolov5 实例分割&#xff1a;从训练到部署 1.模型介绍1.1 YOLOv5结构1.2 YOLOv5 推理时间 2.构建数据集2.1 使用labelme标注数据集2.2 生成coco格式label2.3 coco格式转yolo格式 3.训练3.1 整理数据集3.2 修改配置文件3.3 执行代码进行训练 4.使用OpenCV进行c部署参考文…...

【设计模式】行为型设计模式之 策略模式学习实践

介绍 策略模式&#xff08;Strategy&#xff09;&#xff0c;就是⼀个问题有多种解决⽅案&#xff0c;选择其中的⼀种使⽤&#xff0c;这种情况下我们 使⽤策略模式来实现灵活地选择&#xff0c;也能够⽅便地增加新的解决⽅案。⽐如做数学题&#xff0c;⼀个问题的 解法可能有…...

lua中大数相乘的问题

math.maxinteger * 2 --> -2 原因&#xff1a;math.maxinteger的二进制 &#xff1a; 0111111111111111111111111111111111111111111111111111111111111111 往左移位&#xff0c;最右加一个0&#xff0c;是 1111111111111111111111111111111111111111111111111111111111111…...

第一个SpringBoot项目

目录 &#x1f4ad;1、新建New Project IDEA2023版本创建Sping项目只能勾选17和21&#xff0c;却无法使用Java8&#xff1f;&#x1f31f; 2、下载JDK 17&#x1f31f; &#x1f4ad;2、项目创建成功界面 1、目录 &#x1f31f; 2、pom文件&#x1f31f; &#x1f4ad;3、…...

Android 10.0 Launcher修改density禁止布局改变功能实现

1.前言 在10.0的系统rom定制化开发中,在关于Launcher3的定制化功能中,在有些功能需要要求改变系统原有的density屏幕密度, 这样就会造成Launcher3的布局变化,所以就不符合要求,接下来就来看下如何禁止改变density造成Launcher3布局功能 改变的实现 2.Launcher修改densit…...

CAN协议简介

协议简介 can协议是一种用于控制网络的通信协议。它是一种基于广播的多主机总线网络协议&#xff0c;常用于工业自动化和控制领域。can协议具有高可靠性、实时性强和抗干扰能力强的特点&#xff0c;被广泛应用于汽车、机械、航空等领域。 can协议采用了先进的冲突检测和错误检测…...

(二)JSX基础

什么是JSX 概念&#xff1a;JSX是JavaScript和XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在JS代码中编写HTML模版结构&#xff0c;它是React中编写UI模板的方式。 优势&#xff1a;1.HTML的声明式模版方法&#xff1b;2.JS的可编程能力 JSX的本质 JSX并不是标准…...

GB 38469-2019 船舶涂料中有害物质限量检测

船舶涂料是指涂于船舶各部位&#xff0c;能防止海水、海洋大气腐蚀和海生物附着及满足船舶特种要求的各种涂料的统称。 GB 38469-2019船舶涂料中有害物质限量检测项目&#xff1a; 测试指标 测试方法 挥发性有机化合物VOC GB 30981 甲苯 GB 24408 苯 GB 30981 甲醇 G…...

汇编:数组-寻址取数据

比例因子寻址&#xff1a; 比例因子寻址&#xff08;也称为比例缩放索引寻址或基址加变址加比例因子寻址&#xff09;是一种复杂的内存寻址方式&#xff0c;常用于数组和指针操作。它允许通过一个基址寄存器、一个变址寄存器和一个比例因子来计算内存地址。 语法 比例因子寻…...

ROS自带的OpenCV库和自己安装版本冲突问题现象及解决方法

文章目录 1. 问题现象1.1 编译过程警告1.2 程序运行报错 2. 分析问题原因3. 解决方法 1. 问题现象 1.1 编译过程警告 warning: lipopencv_improc.so.406, needed by /usr/local/lib/libopencv_xfeatures2d.so.4.6.0, may conflict with libopencv_imgproc.so.4.21.2 程序运行…...

html+CSS+js部分基础运用19

1. 应用动态props传递数据&#xff0c;输出影片的图片、名称和描述等信息【要求使用props】&#xff0c;效果图如下&#xff1a; 2.在页面中定义一个按钮和一行文本&#xff0c;通过单击按钮实现放大文本的功能。【要求使用$emit()】 代码可以截图或者复制黏贴放置在“实验…...

实测:用GPT-4和KernelBench自动生成CUDA内核,效果到底如何?

实测&#xff1a;GPT-4与KernelBench自动生成CUDA内核的实战效果分析 当我在深夜调试一个矩阵乘法的CUDA内核时&#xff0c;第17次尝试依然无法突破PyTorch原生实现的性能。这种场景对GPU开发者来说再熟悉不过——我们总在手工优化与开发效率之间寻找平衡。而当我第一次听说可以…...

用74LS175D和面包板,手把手教你做一个四人抢答器(附完整电路图)

从零搭建四人抢答器&#xff1a;74LS175D芯片实战指南 在电子技术学习过程中&#xff0c;没有什么比亲手搭建一个实际可用的电路更能加深理解了。今天&#xff0c;我们将使用经典的74LS175D芯片&#xff0c;配合面包板、LED和按键开关&#xff0c;一步步构建一个功能完整的四人…...

Vulkan与OpenGL深度解析——现代图形渲染的技术演进

1. 从OpenGL到Vulkan&#xff1a;图形渲染的进化之路 还记得我第一次接触图形编程时&#xff0c;OpenGL就像一位和蔼的老教授&#xff0c;把复杂的GPU操作封装成简单的API调用。但随着项目复杂度提升&#xff0c;我逐渐发现这位"老教授"的教学方式有些过时——它隐藏…...

Z-Image i2L模型压缩技术:轻量化部署实践指南

Z-Image i2L模型压缩技术&#xff1a;轻量化部署实践指南 1. 引言 当你兴奋地部署了一个强大的图像生成模型&#xff0c;却发现设备内存告急、推理速度慢如蜗牛&#xff0c;这种体验确实让人沮丧。Z-Image i2L作为一款创新的图像到LoRA模型&#xff0c;虽然功能强大&#xff…...

避开Unity动态合批的坑:为什么你的Dynamic Batching不生效?

深度剖析Unity动态合批失效的六大技术陷阱与实战解决方案 当你在Unity项目中精心设计了数百个低多边形道具&#xff0c;却发现性能面板中的Draw Calls居高不下时&#xff0c;动态合批&#xff08;Dynamic Batching&#xff09;很可能正在暗中失效。本文将揭示那些官方文档未曾详…...

DeepSeek-R1-Distill-Qwen-1.5B响应慢?函数调用优化实战解决方案

DeepSeek-R1-Distill-Qwen-1.5B响应慢&#xff1f;函数调用优化实战解决方案 你是不是也遇到过这种情况&#xff1a;好不容易在本地部署了DeepSeek-R1-Distill-Qwen-1.5B这个“小钢炮”模型&#xff0c;结果发现函数调用时响应特别慢&#xff1f;明明官方说RTX 3060能跑200 to…...

数字化、智能化、移动化,人力资源系统革新的三大法宝!

人力资源系统革新&#xff0c;打造企业人才发展新引擎在当今竞争激烈的商业环境中&#xff0c;企业的人才发展成为了决定其成败的关键因素之一。然而&#xff0c;传统的人力资源管理系统往往存在着诸多问题&#xff0c;如流程繁琐、数据不精准、缺乏智能化等&#xff0c;这些问…...

ECG-Emotion Recognition(情绪识别)实战指南:WESAD与DREAMER数据集深度解析与应用

1. 情绪识别与ECG技术入门指南 第一次接触ECG情绪识别时&#xff0c;我和大多数人一样充满疑惑&#xff1a;心跳数据真能反映人的情绪&#xff1f;经过三个月的项目实践&#xff0c;我可以肯定地说&#xff0c;ECG信号就像情绪的"心电图"&#xff0c;愤怒时心跳加速、…...

ArcGIS模型构建器实战:一键加载上百个SHP文件(含子文件夹),告别手动拖拽

ArcGIS模型构建器实战&#xff1a;一键加载上百个SHP文件&#xff08;含子文件夹&#xff09;&#xff0c;告别手动拖拽 当你的硬盘里散落着数百个SHP文件&#xff0c;它们像秋天的落叶一样分布在几十层子文件夹中时&#xff0c;传统的手动拖拽加载方式简直是一场噩梦。上周我接…...

深入解析串口通信:从RS232到RS485的工业应用实战

1. 串口通信的工业应用基础 第一次接触工业自动化项目时&#xff0c;我被现场密密麻麻的线缆搞得头晕眼花。直到老师傅指着角落里不起眼的两根双绞线说&#xff1a;"这条RS485总线控制着整条生产线的30台设备"&#xff0c;我才意识到串口通信在工业领域的强大之处。 …...