伊洪老师的每周 cpython debug 真是让人神清气爽,我在工位上一边打瞌睡一边和 gpt5 玩 Linux 开心词典,刷到伊老师的帖子,一扫昨晚打游戏到 2am 的昏昏欲睡。
https://github.com/yihong0618/gitblog/issues/325
我复盘学习了一下伊老师的题解,大概是这样的:
python3.13 repl 里运行下面代码卡死
>>> import _testcapi
>>> _testcapi.set_nomemory(0) # Now wait forever
起手先检查是 on cpu 还是 off cpu
$ s perf stat -p $(pidof python3.13-dbg) -- sleep 1
Performance counter stats for process id '28667':
1,001.16 msec task-clock # 1.000 CPUs utilized
1 cpu 使用率,看来可能是死循环了。
看看是不是和上次一样 syscall 报错死循环了
$ s strace -fTttp $(pidof python3.13-dbg)
strace: Process 28667 attached
没有输出,说明是纯用户态死循环。
on cpu,纯用户态死循环,采个样,看看在哪个函数死循环
$ s perf record -g -p $(pidof python3.13-dbg) -- sleep 1
火焰图(青春版)的最高比例栈是这样的:
$ s perf report -g --stdio
_PyEval_EvalFrame.lto_priv.0
|
|--95.94%--_PyEval_EvalFrameDefault
| |
| |--55.82%--PyLong_FromLong
| | |
| | --53.27%--_PyLong_FromMedium
_PyEval_EvalFrameDefault 占用了 95.9% 的采样。
解析一下符号,看看是哪一行代码在搞事:
$ s perf annotate -l --stdio --symbol _PyEval_EvalFrameDefault
Sorted summary for file /usr/bin/python3.13d
----------------------------------------------
21.16 ceval.c:905
13.54 ceval.c:913
10.90 ceval.c:889
10.42 ceval.c:887
9.51 pycore_frame.h:86
7.90 ceval.c:907
7.21 ceval.c:912
6.79 ceval.c:937
6.28 ??:0
4.94 ceval.c:914
0.89 ceval.c:906
看看代码,一直在 887L-914L 打转,如图,所以锁定了 goto exception_unwind 死循环,QED.
1️⃣老师好厉害😊我决定再打40h游戏就开始学习了😊
https://github.com/yihong0618/gitblog/issues/325
我复盘学习了一下伊老师的题解,大概是这样的:
python3.13 repl 里运行下面代码卡死
>>> import _testcapi
>>> _testcapi.set_nomemory(0) # Now wait forever
起手先检查是 on cpu 还是 off cpu
$ s perf stat -p $(pidof python3.13-dbg) -- sleep 1
Performance counter stats for process id '28667':
1,001.16 msec task-clock # 1.000 CPUs utilized
1 cpu 使用率,看来可能是死循环了。
看看是不是和上次一样 syscall 报错死循环了
$ s strace -fTttp $(pidof python3.13-dbg)
strace: Process 28667 attached
没有输出,说明是纯用户态死循环。
on cpu,纯用户态死循环,采个样,看看在哪个函数死循环
$ s perf record -g -p $(pidof python3.13-dbg) -- sleep 1
火焰图(青春版)的最高比例栈是这样的:
$ s perf report -g --stdio
_PyEval_EvalFrame.lto_priv.0
|
|--95.94%--_PyEval_EvalFrameDefault
| |
| |--55.82%--PyLong_FromLong
| | |
| | --53.27%--_PyLong_FromMedium
_PyEval_EvalFrameDefault 占用了 95.9% 的采样。
解析一下符号,看看是哪一行代码在搞事:
$ s perf annotate -l --stdio --symbol _PyEval_EvalFrameDefault
Sorted summary for file /usr/bin/python3.13d
----------------------------------------------
21.16 ceval.c:905
13.54 ceval.c:913
10.90 ceval.c:889
10.42 ceval.c:887
9.51 pycore_frame.h:86
7.90 ceval.c:907
7.21 ceval.c:912
6.79 ceval.c:937
6.28 ??:0
4.94 ceval.c:914
0.89 ceval.c:906
看看代码,一直在 887L-914L 打转,如图,所以锁定了 goto exception_unwind 死循环,QED.
1️⃣老师好厉害😊我决定再打40h游戏就开始学习了😊