对subprocess启动的子进程使用VSCode python debugger
文章目录
- 1 情况概要(和文件结构)
- 2 具体设置和启动步骤
- 2.1 具体配置
- Step 1 针对attach debugger到子进程
- Step 2 针对子进程的暂停
- (可选) Step 3 判断哪个进程id是需要的子进程
- 2.2 启动步骤和过程
- 3 其他问题解决
- 3.1
- 3.2 ptrace: Operation not permitted
- 其他解决方案*2
- 方案一(ChatGPT提供,对我不可行)
- 方案二(Github issue翻到)
- 参考
1 情况概要(和文件结构)
环境:Linux Ubuntu
最近在跑大模型,遇到一份代码的具体程序是通过subprocess.run()
来启动的,而vscode的debug功能无法追踪进去。也就是说,我有父进程launch.py来启动subprocess.run()
,调用子进程文件run.py
。我可以单步调试追踪到subprocess
这一步并进入run()
函数,但是无法继续进入子进程的工作,无法追踪到run.py
看我真正想看的代码。
这里父进程文件和子进程文件的概念我没有细究,大概意思是主动调用subprocess.run()
来创建子进程的是父进程文件,被subprocess.run()
跑起来的是子进程文件。
附上文件结构的简单示意。
-
test.sh:
python launch.py
并传一堆参数 -
launch.py:父进程,主要内容为
def python_launch(args):"""Vanilla python launcher for degbugging purposes"""# ....# 构造cmdcmd = f"python {args.run_file}" # 省略一堆参数# 启动subprocesssubprocess.run(cmd, shell=True)
- run.py:子进程,主要内容为
def main(cfg):# 环境变量设置,数据读取,新建文件夹之类的之类的# ...# 初始化trainer并训练trainer = build_trainer(cfg)trainer.run()
2 具体设置和启动步骤
我们的目标是,我从某个地方把程序起起来并创建了子进程,然后把debugger连接到子进程上,于是它可以在子进程的断点地方停下、正常调试。
那么我们需要做到两件事情:1)把Debugger attach到子进程;2)子进程要能等待我们attach,而不是一股脑往下运行,那就来不及停在断点。
2.1 具体配置
我们分别对这两件事情做配置。
Step 1 针对attach debugger到子进程
采用vscode的python debugger插件,新建debugger config如下(编辑的是launch.json)
{"name": "Python: Attach to Subprocess", //随便起名"type": "python","request": "attach", //附加到子进程"processId": "${command:pickProcess}" //选择进程id
}
这里用${command:pickProcess}
是采用vscode自带的命令,从进程列表中手动选择,而不是写死进程id。
实测这些内容就够了,不需要其他key比如ChatGPT建议的justMyCode和subProcess。
Step 2 针对子进程的暂停
在子进程文件,你需要断点的代码前面,或者索性最前面,加上一行:
input("Continue...")
这行会让代码停下,直到你在命令行中随便敲点什么,回车也行,才继续执行。
(可选) Step 3 判断哪个进程id是需要的子进程
因为我实在小白,我不确定哪个进程才是我要的,所以我在子进程文件里加了几行,输出父进程id和子进程id。
print(f"Parent PID (PPID): {os.getppid()}")print(f"Current PID: {os.getpid()}")
Current PID就是我们要的子进程id
以上,配置完了,我的run.py最终长这样:
def main(cfg):#### for debug ########## 输出父进程和子进程idprint(f"Parent PID (PPID): {os.getppid()}")print(f"Current PID: {os.getpid()}")# 可选,用来检查user id,原因后面说print(f"UID: {os.getuid()}, EUID: {os.geteuid()}") # 暂停input("Continue...")########################## 环境变量设置,数据读取,新建文件夹之类的之类的# ...trainer = build_trainer(cfg)trainer.run()
2.2 启动步骤和过程
需要你操作的地方写了人工,其他的是自动执行顺序。
-
(人工)正常通过命令行执行sh test.sh,启动脚本
-
程序进入
launch.py
,启动subprocess -
程序进入
run.py
3.1. 输出父进程id和子进程id供参考
3.2. 在input(Continue...)
处暂停,等待键入字符才能继续执行
-
(人工)启动debug的Subprocess Attach,选择子进程,附加到正确的id上,等待…
-
attach到子进程,可能需要一会。
在DEBUG CONSOLE里会提示结果,要么是attach成功(如图),要么是弹窗报错然后在DEBUG CONSOLE里看错误信息。
此时可以看到调试工具栏表示正在执行、没有暂停,因为我们还在被input()暂停着。
-
(人工)在命令行里敲个回车,跳出
input(Continue...)
-
断点停止在run.py中的对应位置
-
(人工)正常调试
3 其他问题解决
3.1
--- Starting attach to pid: 1103 ---
/bin/sh: 1: gdb: not found
解决方案是安装gdb
apt-get update
apt-get upgrade -y
apt-get install gdb
3.2 ptrace: Operation not permitted
解释一下前面python里为什么写了一句进程创建用户id查询
我在第5步attach环节遇到了一个错误,ptrace: Operation not permitted,是个权限错误。
--- Starting attach to pid: 654608 ---
Could not attach to process. If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf
ptrace: Operation not permitted.
问了下ChatGPT:
/proc/sys/kernel/yama/ptrace_scope 文件
这个文件控制了 ptrace 系统调用的访问权限。ptrace 是 Linux 的一个系统调用,允许一个进程跟踪和控制另一个进程,是调试器工作的核心。
ptrace_scope 参数的值
0: 允许任何进程使用 ptrace 附加到其他进程(受用户权限约束)。
1: 仅允许父进程(如直接启动的调试器进程)附加到子进程。
2: 禁止所有非父子关系的调试。
3: 禁止所有 ptrace 附加操作。
默认值通常为 1,为了安全性避免恶意进程滥用 ptrace。
查询了一下这个值(cat /proc/sys/kernel/yama/ptrace_scope
),输出是1。但是显然我的父进程和子进程都是同一个user启用的,不懂为什么说我权限错误。
查询进程创建用户有好几个方法,我是在python里写了一句这个。(解释了前文的查询用户id是啥用)
print(f"UID: {os.getuid()}, EUID: {os.geteuid()}")
但是到处折腾了一圈别的方案没解决,还是回来把这个值设为0了,真就解决了。
这个值的设置需要root权限。废话,如果本来就是用root在跑的话权限统一也不会报这个错了。
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
ChatGPT也说了,这个值设置为0的话不太安全,建议用完就给它改回去。于是写了个脚本方便切换值,插入在.bashrc文件里(vim ~/.bashrc
)
ptrace_scope() {current_value=$(cat /proc/sys/kernel/yama/ptrace_scope) echo "[INTRO] Script for changing between 0 & 1 value for /proc/sys/kernel/yama/ptrace_scope. The value should vary from [0,3] for different safety levels, default as 1"echo; # 换行echo "current value = $current_value" # 获取当前值# 根据当前值,在0和1之间切换if [ "$current_value" -eq 1 ]; thenecho "Now changing to 0..."echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scopeelif [ "$current_value" -eq 0 ]; thenecho "Now changing to 1 ..."echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scopeelseecho "[Warning] Unknown ptrace_scope current value. Nothing takes effect."exit 1fi# 检查是否执行成功,并提醒恢复0值current_value=$(cat /proc/sys/kernel/yama/ptrace_scope)echo "[INFO] ptrace_scope changed to $current_value"echo;if [ "$current_value" -eq 1 ]; thenecho "[INFO] Safe default setting ^-^"elif [ "$current_value" -eq 0 ]; thenecho "[INFO] Unsafe setting, remember to change back to value = 1."fiecho;
}
记得source ~/.bashrc
使配置生效。
效果如下,通过ptrace_scope change
指令实现0-1切换。
其他解决方案*2
方案一(ChatGPT提供,对我不可行)
针对debugger监听子进程这个事情,ChatGPT还给了我一套方案,但用不了。记一下大概配置,哪哪都折腾过了,这个debugpy的wait for client啊就是不知道wait到了什么,直接就监听到了,但我明明还没开debugger的attach!
在子进程文件里写
import debugpyint main():# 启动调试服务debugpy.listen(("0.0.0.0", 5678))print("Debugpy is listening on port 5678")# 等待客户端连接debugpy.wait_for_client()print("Debugger is attached!")# trainer.......
在debugger config里写一个针对test脚本执行的config,和debug普通python文件一个写法。另外再写一个attach用的config,用的监听路径,大概如下:
{"name": "Python: Attach to Subprocess","type": "python","request": "attach","connect": {"host": "localhost","port": 5678},"justMyCode": false,"subProcess": false
}
方案二(Github issue翻到)
还看到一个更暴力的是是直接改写,不用subprocess,见GitHub: embodied-generalist/issues/33
因为它只是inference但是我要train…小白还不知道不开子进程会不会有影响,就没碰
参考
- StackOverflow Attaching a VSCode Debugger to a Sub Process in Python
- GitHub: embodied-generalist/issues/33
相关文章:
对subprocess启动的子进程使用VSCode python debugger
文章目录 1 情况概要(和文件结构)2 具体设置和启动步骤2.1 具体配置Step 1 针对attach debugger到子进程Step 2 针对子进程的暂停(可选) Step 3 判断哪个进程id是需要的子进程 2.2 启动步骤和过程 3 其他问题解决3.13.2 ptrace: Operation not permitted…...
Django启用国际化支持(2)—实现界面内切换语言:activate()
文章目录 ⭐注意⭐1. 配置项目全局设置:启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…...
基于单片机的多功能跑步机控制系统
本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器,由七个电路模块组成,分别是:单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中,单片机模块是整个…...
VSCode 如何选中包含某个字母的所有行
文章目录 写在前面一、需求描述二、解决方法参考链接 写在前面 自己的测试环境:VSCode 一、需求描述 由于需要处理文件,需求是删除文件中包含某个字母的所有行。 二、解决方法 在 Visual Studio Code (VSCode) 中,如果你想选中所有包含某…...
CSRF保护--laravel进阶篇
laravel对csrf非常重视,专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久,那么您可能对于web.php路由文件的post请求很疑惑,因为get请求很顺利,而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…...
计算机网络-理论部分(二):应用层
网络应用体系结构 Client-Server客户-服务器体系结构:如Web,FTP,Telnet等Peer-Peer:点对点P2P结构,如BitTorrent 应用层协议定义了: 交换的报文类型,请求or响应报文类型的语法字段的含义如何…...
k8s1.31版本最新版本集群使用容器镜像仓库Harbor
虚拟机 rocky9.4 linux master node01 node02 已部署k8s集群版本 1.31 方法 一 使用容器部署harbor (1) wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce systemctl enable docker…...
QT中使用json格式存取矩阵数据
在 Qt 中,可以通过 QJsonDocument 和 QJsonArray 方便地存取 JSON 格式的矩阵数据。以下是存储和读取矩阵数据的完整实现示例。 1. 矩阵存储为 JSON 将矩阵(QVector<QVector<double>> 或其他二维数组)存储为 JSON 文件。 实现代码 #include <QJsonArray&g…...
k8s 集群安装
安装rockylinux https://www.jianshu.com/p/a5fe20318b8e https://www.cnblogs.com/haoee/p/18290506 配置VirtualBox双网卡 https://www.cnblogs.com/ShineLeBlog/p/17580311.html https://zhuanlan.zhihu.com/p/341328334 https://blog.csdn.net/qq_36544785/article/deta…...
Elasticsearch面试内容整理-核心概念与数据模型
在 Elasticsearch 中,理解核心概念与数据模型是非常重要的,因为它们定义了数据如何被组织、存储和搜索。以下是 Elasticsearch 的核心概念和数据模型的详细介绍。 核心概念 集群(Cluster) ● 集群是由一个或多个节点组成的,用于共同存储和搜索数据的集合。...
Spring Boot实现License生成和校验
Spring Boot实现License生成和校验 证书准备 # 1. 生成私钥库 # validity:私钥的有效期(天) # alias:私钥别称 # keystore:私钥库文件名称(生成在当前目录) # storepass:私钥库密码…...
es写入磁盘的过程以及相关优化
数据写入到内存buffer同时写入到数据到translog buffer,这是为了防止数据不会丢失每隔1s数据从buffer中refresh到FileSystemCache中,生成segment文件,这是因为写入磁盘的过程相对耗时,借助FileSystemCache,一旦生成segment文件,就能通过索引查询到了refresh完,memory bu…...
十大网络安全事件
一、私有云平台遭攻击,美国数千家公司工资难以发放 1月,专门提供劳动力与人力资本管理解决方案的美国克罗诺斯(Kronos)公司私有云平台遭勒索软件攻击,事件造成的混乱在数百万人中蔓延。 克罗诺斯母公司UKG集团…...
【数据结构】【线性表】栈的基本概念(附c语言源码)
栈的基本概念 讲基本概念还是回到数据结构的三要素:逻辑结构,物理结构和数据运算。 从逻辑结构来讲,栈的各个数据元素之间是通过是一对一的线性连接,因此栈也是属于线性表的一种从物理结构来说,栈可以是顺序存储和顺…...
修改ffmpeg实现https-flv内容加密
目录 1 前言 2 ffmpeg源码修改 2.1 增加头文件 2.2 http上下文增加解密密钥和AVAESCTR结构体 2.3 aes解密上下文初始化 2.4 对http数据部分解密 2.5 http关闭时清理资源 3 ffmpeg使用 1 前言 当前视频拉流已经通过URL鉴权方式来对访客身份进行识别和过滤,但…...
react中useMemo的使用场景
useMemo 是 React 的一个 Hook,用来优化性能,尤其是在计算复杂值时。它会记住(缓存)计算结果,只有在依赖项变化时才重新计算,避免不必要的重复计算。 import React, { useMemo } from react; function Ex…...
Pytorch自定义算子反向传播
文章目录 自定义一个线性函数算子如何实现反向传播 有关 自定义算子的实现前面已经提到,可以参考。本文讲述自定义算子如何前向推理反向传播进行模型训练。 自定义一个线性函数算子 线性函数 Y X W T B Y XW^T B YXWTB 定义输入M 个X变量,输出N个…...
aws服务(二)机密数据存储
在AWS(Amazon Web Services)中存储机密数据时,安全性和合规性是最重要的考虑因素。AWS 提供了多个服务和工具,帮助用户确保数据的安全性、机密性以及合规性。以下是一些推荐的存储机密数据的AWS服务和最佳实践: 一、A…...
VMware Workstation 17.6.1
概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1: 本月11号官宣:针对所有人免费提供,包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后,双击默认安装即可: 一路单击下一步按钮: 等待…...
高校企业数据挖掘平台推荐
TipDM数据挖掘建模平台是由广东泰迪智能科技股份有限公司自主研发打造的可视化、一站式、高性能的数据挖掘与人工智能建模服务平台,致力于为使用者打通从数据接入、数据预处理、模型开发训练、模型评估比较、模型应用部署到模型任务调度的全链路。平台内置丰富的机器…...
Vue项目开发 formatData 函数有哪些常用的场景?
formatData 不是 JavaScript 中的内建函数,它通常是一个自定义函数,用来格式化数据。不同的开发环境和框架中可能有不同的 formatData 实现方式。如果你指的是某个特定框架或者库中的 formatData,请提供更多的上下文信息。不过,以…...
【AI知识】两类最主流AI应用(文生图、ChatGPT)中的目标函数
之前写过一篇 【AI知识】了解两类最主流AI任务中的目标函数,介绍了AI最常见的两类任务【分类、回归】的基础损失函数【交叉熵、均方差】,以初步了解AI的训练目标。 本篇更进一步,聊一聊流行的“文生图”、“聊天机器人ChatGPT”模型中的目标函…...
【单片机基础】定时器/计数器的工作原理
单片机中的定时器/计数器(Timer/Counter)是用于时间测量和事件计数的重要模块。它们可以用来生成精确的延时、测量外部信号的频率或周期、捕获外部事件的时间戳等。理解定时器/计数器的工作原理对于单片机编程和系统设计非常重要。以下是定时器/计数器的…...
ModuleNotFoundError: No module named ‘distutils.msvccompiler‘ 报错的解决
报错 在conda 环境安装 numpy 时,出现报错 ModuleNotFoundError: No module named distutils.msvccompiler 解决 Python 版本过高导致的,降低版本到 Python 3.8 conda install python3.8即可解决。...
HCIA笔记2--ARP+ICMP+VRP基础
1. ARP ARP: 地址解析协议(address resolve protocol)。 网络数据包在通信的时候一般是使用 I P IP IP地址进行通信。 但是在封装数据链路层的时候是需要目标 m a c mac mac地址的。 而 A R P ARP ARP协议实现的功能就是根据 I P IP IP地址来获得 m a c mac mac地址。 1.1 a…...
SpringBoot与MongoDB深度整合及应用案例
SpringBoot与MongoDB深度整合及应用案例 在当今快速发展的软件开发领域,NoSQL数据库因其灵活性和可扩展性而变得越来越流行。MongoDB,作为一款领先的NoSQL数据库,以其文档导向的存储模型和强大的查询能力脱颖而出。本文将为您提供一个全方位…...
Redis模拟延时队列 实现日程提醒
使用Redis模拟延时队列 实际上通过MQ实现延时队列更加方便,只是在实际业务中种种原因导致最终选择使用redis作为该业务实现的中间件,顺便记录一下。 该业务是用于日程短信提醒,用户添加日程后,就会被放入redis队列中等待被执行发…...
vue项目中富文本编辑器的实现
文章目录 vue前端实现富文本编辑器的功能需要用到第三方库1. 安装包2.全局引入注册3.组件内使用4.图片缩放功能实现①安装包②注册并添加配置项③报错解决 vue前端实现富文本编辑器的功能需要用到第三方库 vue2使用vue-quill-editor,vue3使用vueup/vue-quill&#…...
nginx 配置lua执行shell脚本
1.需要nginx安装lua_nginx_module模块,这一步安装时,遇到一个坑,nginx执行configure时,一直提示./configure: error: unsupported LuaJIT version; ngx_http_lua_module requires LuaJIT 2.x。 网上一堆方法都试了,都…...
Keil+VSCode优化开发体验
目录 一、引言 二、详细步骤 1、编译器准备 2、安装相应插件 2.1 安装C/C插件 2.2 安装Keil相关插件 3、添加keil环境变量 4、加载keil工程文件 5、VSCode中成功添加工程文件后可能出现的问题 5.1 编码不一致问题 6、在VSCode中进行编译工程以及烧录程序 7、效果展示…...
江苏建设执业资格注册中心官方网站/百度我的订单
本人抛弃一些简单常见的快键键,例如 ctrlc ,v ,z之类的 1、ctrld 删除一整行 2、ctrlf 搜索 3、光标选中几行,ctrlalt↓ 向下复制选中的那几行 4、光标选中几行,alt↓ 向下移动 ↑ :向上移动 5、ctr…...
为什么百度地图嵌入网站不显示/深圳网站推广公司
php语言只所以在web开发领域占据半壁江山,是因为它有太多的生态,成熟的框架体系,广泛的开源cms系统。建设网站的时候,都想提升开发效率,效率就是成本,如果你用原生php语言开发一个项目,既要设计…...
wordpress手机网站模版/怎么做蛋糕
作为今年的参与者在电力电子题目中B题AC_DC和C题DC_DC中选择了B题。起初究其题目来说,DC_DC相较于AC_DC较容易实现,但究其最终想获得更好的成绩最终选择AC_DC这题,这也意味着面临着各种风险和未知。 目录 一、题目分析 1.1AC_DC变换电路原…...
做相册的网站dw/交换友情链接的目的
class Book {String name;int price;int num;//构造方法之间的互相调用解决了代码的重复问题,但是一定要留出口public Book() {this("请输入书名",0,0);}public Book(String name) {this(name,9999,9999);//this调用方法}public Book(String name,int num…...
如何做购物网站的后台/武汉seo计费管理
十分钟说课稿推荐各位评委老师,你们好!(鞠躬)我是报考小学数学教师的111号考生,今天我说课的题目是《轴对称图形》。下面我将从教材、教学目标、教学方法、教学过程和板书设计这五个方面进行说课。一、说教材《轴对称图形》是小学数学四年级下…...
做网站去除视频广告/网络营销的八种方式
原题目及解答见第4周-任务4-设计工资类(Salary): 【拓展1】使用salary[50]有限制,实际人数少浪费空间,人数多时无法完成任务。程序执行中先输入职工人数,然后利用教材P217所讲的动态分配内存的运算符new,开辟一个大小…...