CPython调试和性能分析

本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/18608197



cpython解释器#

在源码ceval.c 的 _PyEval_EvalFrameDefault函数有一个大的 switch (opcdoe) 就是字节码解释器的主要部分,示例代码如下:

Copy
switch (opcode) { case LOAD_FAST: // 实现 LOAD_FAST 操作的代码 break; case STORE_FAST: // 实现 STORE_FAST 操作的代码 break; case CALL_FUNCTION: // 实现 CALL_FUNCTION 操作的代码 break; // 其他字节码操作 }

所有的opcode都可以在opcode.h这里查询到

所有的特化指令都可以在opcode.py查询到

调试工具#

python自带pdb命令行下的调试工具

gdb unix下的命令行调试,图形化的使用vs和vscode

GDB是一个强大的Unix下的源代码级调试器。主要用于调试C和C++程序,也有Python的扩展(pythongdb.py) ,可以用来调试Python程序
• 可以attach到运行中进程,断点调试
• 可以加载coredump进行调试

vscode debug的核心实现#

sys.settrace(tracefunc)

在cpython源码中进行插桩

PyEval_SetTrace->

  • trace_function_entry,进入函数
  • trace_function_exit,退出函数

cpython源码支持debug#

在源码中支持行调试,实现方法:opcode->do_tracing,在ceval.c

0、 Opcode变成do_tracing
1、重新获得正确的opcode,并trace
2、 真正执行opcode
3、 下一个opcode变成do_tracing

3.11之后无法在引擎看到脚本堆栈#

natvis就是一个配置文件,只需要拖动到vs的窗口中

原理:natvis定义了如何显示一个结构体

可以看到一些简单类型的变量,tuple/dict可展开

可以看到当前帧

注意:3.11之后,PyFrameObject大改,现在不能用natvis直接拿到脚本栈了,需要在堆栈窗口多次查看对应

常见调试工具-小技巧#

qa的机器才能重现问题,怎么办?
开发过程中,想要不重启,实时让自己写的代码生效,怎么办?
线上问题没法调试,怎么办

qa的机器才能重现问题,怎么办? ——hunter
本质:用exec让游戏动态运行一段代码 ,可以把老代码替换成新代码

2 热更,github有插件,适配自己的项目

3 写log

常见性能分析工具#

cpython提供内置的

tracy 各游戏引擎都接入

tracy如何profile python的
• 方法一:在ceval.c/_PyEval_EvalFrameDefault()里插桩

常见性能分析工具——maze#

自研的,postman内置的内存profile工具

GPM#

技术中心自研的

Python3新特性 :调试与性能分析#

monitoring#

sys.monitoring (since py3.12)

同一段代码跑trace和不跑trace的消耗差20倍,因为trace每行的消耗特别高(overhead)

通过少调用trace function来减少不必要的开销

faulthandler#

faulthandler(since 3.3)
当python挂掉时, 能打印堆栈: 为这些信号注册处理
SIGSEGV, SIGFPE, SIGABRT, SIGBUS, SIGILL

作者:赵青青   一名在【网易游戏】做游戏开发的程序员,擅长Unity3D,游戏开发,.NET等领域。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
posted @   赵青青  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
历史上的今天:
2013-12-15 数学知识在游戏中的运用
2013-12-15 游戏暂停同时角色动作暂停
CONTENTS
点击右上角即可分享
微信分享提示