CPython调试和性能分析

打印 上一主题 下一主题

主题 831|帖子 831|积分 2493

cpython解释器

在源码ceval.c 的 _PyEval_EvalFrameDefault函数有一个大的 switch (opcdoe) 就是字节码解释器的主要部分,示例代码如下:
  1. switch (opcode) {
  2.     case LOAD_FAST:
  3.         // 实现 LOAD_FAST 操作的代码
  4.         break;
  5.     case STORE_FAST:
  6.         // 实现 STORE_FAST 操作的代码
  7.         break;
  8.     case CALL_FUNCTION:
  9.         // 实现 CALL_FUNCTION 操作的代码
  10.         break;
  11.     // 其他字节码操作
  12. }
复制代码
所有的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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表