0

0

Python代码被卡住怎么调试_利用Py-Spy动态附加到正在运行的进程生成火焰图分析死锁位置

P粉602998670

P粉602998670

发布时间:2026-03-10 18:21:21

|

819人浏览过

|

来源于php中文网

原创

py-spy 附加失败主因是系统权限限制及符号缺失:linux/macos 需 ptrace 权限(sudo 或调优内核参数),macos 需禁用 sip;火焰图全为 ??? 说明未加载 python 符号,应使用官方 cpython 且未 strip;死锁常表现为 epoll_wait/select 卡住、栈顶平坦,需结合 py-spy top/dump 查锁对象;多进程须单独 attach 子进程或启用 --subprocesses;函数名截断多因装饰器或 c 扩展,可加 --native 辅助分析;根本难点在于将底层阻塞与业务代码精准关联。

python代码被卡住怎么调试_利用py-spy动态附加到正在运行的进程生成火焰图分析死锁位置

Py-Spy 附加失败:进程没权限或没符号

Linux/macOS 下 py-spy 默认需要 ptrace 权限,普通用户直接附加常报 Operation not permitted 或静默失败。不是代码问题,是系统限制。

  • Linux 上临时解决:用 sudo py-spy record -p <code>PID --duration 30 -o flame.svg(注意 PID 要替换成真实进程号)
  • 更稳妥的做法:启动 Python 进程前加 prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY),但需修改源码;或改用 --nonblocking 模式降低侵入性
  • macOS 上需关闭 SIP,或在开发机上用 sudo 启动 py-spy;否则即使进程是自己启的,也会被拦
  • 如果火焰图里全是 ??? 或地址(如 0x7ff... ),说明没加载 Python 符号——确认用的是官方 CPython(非 PyO3/conda 自编译等变体),且没 strip 过二进制

火焰图看不出死锁:只看到 selectepoll_wait 或空栈

Py-Spy 抓的是采样时刻的调用栈,而死锁往往卡在系统调用或锁等待点,上层 Python 帧可能已退出,只剩 C 层阻塞。这时候火焰图顶部平坦、无明显热点,不代表没卡住。

  • 先看 py-spy top -p <code>PID 实时观察线程状态:如果某线程长时间停在 threading.Lock.acquirequeue.getsocket.recv,就是线索
  • py-spy dump -p <code>PID 查所有线程完整栈,重点找重复出现的锁对象 ID(比如 <lock object at></lock>),多个线程卡在同一个地址大概率是它
  • 火焰图里若大量样本落在 time.sleepthreading.Condition.wait,别急着忽略——可能是条件未满足导致的假性“空转”,得结合业务逻辑判断是否该唤醒没唤醒

Python 多进程场景下只看到主进程,子进程没采到

py-spy 默认只 attach 指定 PID,而 multiprocessing 子进程是全新进程,PID 不同,不手动指定就漏掉。死锁常发生在子进程通信环节(比如 Queue.put 阻塞),光看主进程会误判。

FaceSwapper
FaceSwapper

FaceSwapper是一款AI在线换脸工具,可以让用户在照片和视频中无缝交换面孔。

下载
  • ps aux | grep pythonpgrep -P <code>PID 找出全部子进程 PID,再逐个 py-spy record -p <code>CHILD_PID -o child-flame.svg
  • 如果子进程由 multiprocessing.spawn 启动(如 Windows/macOS 默认),它们可能共享父进程的部分环境,但仍是独立进程,必须单独 attach
  • 注意:子进程可能启动快、结束快,采样窗口太短会错过;建议用 --duration 60 并配合 --subprocesses 参数(v0.9.0+ 支持),自动抓本进程及其子 Python 进程

生成的火焰图里函数名被截断或显示为 <method></method>

这是 Py-Spy 无法解析帧对象中的函数名字段,常见于使用了装饰器(尤其 @cached_property@dataclass 自动生成的方法)、C 扩展模块或某些异步框架(如 FastAPI 的依赖注入栈)。

立即学习Python免费学习笔记(深入)”;

  • 不用硬解,优先看栈深度和调用路径:即使显示 <method></method>,它上面是谁、下面是谁,仍能定位上下文
  • --native 参数让 Py-Spy 同时采集 C 层栈,有时能暴露底层阻塞点(如 pthread_cond_wait
  • 如果大量 <method></method> 出现在 asyncio 相关位置,检查是否用了 loop.run_in_executor 卡住线程池,此时要结合 concurrent.futures 状态分析

真正难的不是画出火焰图,而是把图里那个扁平的 epoll_wait 块,和你代码里第 217 行那个忘了 await 的协程调用对上号——这中间差的是对运行时模型的理解,不是工具能自动补全的。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

28

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

251

2026.02.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

442

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1476

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1169

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

835

2023.08.01

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号