diag(vkernel): _render() 各阶段埋 [rc] 面包屑,定位卡死步骤

日志证据:本轮 [dt] 心跳一行都没打印 → 桌面线程没走到“每秒”分支,即卡在第一轮循环里;
而屏幕顶部出现一小块蓝色 → 很可能执行到第一次 _render() 中途卡住(写了一半)。
宿主 QEMU 随后 abort(0x40000015 = STATUS_FATAL_APP_EXIT)。

在 _render() 埋 6 个面包屑:
  [rc] entry / bg done / taskbar done / windows done / cursor done / vblank done / flush done
最后打印的那条 = 卡住的那一步。若连 [rc] entry 都没有,则卡点在其之前
(_update_mouse / _update_keyboard / _heartbeat_check),再补那边。
定位后连同所有 [DIAG] 一并移除。
This commit is contained in:
TermiNexus committed 2026-10-14 14:13:10 +08:00
1 parent 164228e15a
commit cfbb0c1286
1 file changed
+7
+7
View File
@@ -1294,6 +1294,7 @@ _perf_t_fb: uint64 = 0
def _render():
global _render_count, _cached_top_win
global _perf_t_bg, _perf_t_win, _perf_t_cur, _perf_t_fb
serial.puts("[rc] entry\n")
w: int = _screen_w
h: int = _screen_h
pitch: int = _fb_pitch
@@ -1313,8 +1314,10 @@ def _render():
py_bg += 1
t1: uint64 = timer.timer_get_ticks()
_perf_t_bg += (t1 - t0)
serial.puts("[rc] bg done\n")
_draw_taskbar(back)
serial.puts("[rc] taskbar done\n")
t2: uint64 = timer.timer_get_ticks()
sorted: [MAX_APP_WINDOWS]int
@@ -1335,6 +1338,7 @@ def _render():
_draw_app_window(back, &_wins[sorted[si]])
t3: uint64 = timer.timer_get_ticks()
_perf_t_win += (t3 - t2)
serial.puts("[rc] windows done\n")
# Mark cursor rows as dirty so cursor gets flushed to framebuffer
_mark_rows_dirty(_cursor_y, CURSOR_H)
@@ -1342,8 +1346,10 @@ def _render():
_draw_cursor(back)
t4: uint64 = timer.timer_get_ticks()
_perf_t_cur += (t4 - t3)
serial.puts("[rc] cursor done\n")
_wait_vblank()
serial.puts("[rc] vblank done\n")
if _dirty_count > 0:
py_fb: int = _dirty_y_min
while py_fb <= _dirty_y_max:
@@ -1357,6 +1363,7 @@ def _render():
py_fb += 1
t5: uint64 = timer.timer_get_ticks()
_perf_t_fb += (t5 - t4)
serial.puts("[rc] flush done\n")
_render_count += 1