From cfbb0c128618554d98118ba92a48839d550053bf Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 14 Oct 2026 14:13:10 +0800 Subject: [PATCH] =?UTF-8?q?diag(vkernel):=20=5Frender()=20=E5=90=84?= =?UTF-8?q?=E9=98=B6=E6=AE=B5=E5=9F=8B=20[rc]=20=E9=9D=A2=E5=8C=85?= =?UTF-8?q?=E5=B1=91=EF=BC=8C=E5=AE=9A=E4=BD=8D=E5=8D=A1=E6=AD=BB=E6=AD=A5?= =?UTF-8?q?=E9=AA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 日志证据:本轮 [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] 一并移除。 --- VKernel/Kernel/services/desktop.vp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/VKernel/Kernel/services/desktop.vp b/VKernel/Kernel/services/desktop.vp index 719da38..f0c0478 100644 --- a/VKernel/Kernel/services/desktop.vp +++ b/VKernel/Kernel/services/desktop.vp @@ -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