🟡 [M16] TUI 渲染无 MAX_WRAP_INPUT_LEN 保护,巨大单行可冻结 UI #26

Closed
opened 2026-06-03 13:53:58 +08:00 by dailz · 1 comment
Owner

文件: tui/app.rs:196-207
分类: 渲染 / 性能

问题: Core 的 visual-height 计算有 MAX_WRAP_INPUT_LEN 保护,但 TUI viewport 渲染直接对完整行内容调用 wrap_line_chars,巨大单行可冻结 UI。

建议修复: TUI 侧也应用 MAX_WRAP_INPUT_LEN 保护,超大行截断或作为一行显示。

**文件**: `tui/app.rs:196-207` **分类**: 渲染 / 性能 **问题**: Core 的 visual-height 计算有 `MAX_WRAP_INPUT_LEN` 保护,但 TUI viewport 渲染直接对完整行内容调用 `wrap_line_chars`,巨大单行可冻结 UI。 **建议修复**: TUI 侧也应用 `MAX_WRAP_INPUT_LEN` 保护,超大行截断或作为一行显示。
dailz added the bugseverity/mediumarea/tui labels 2026-06-03 13:53:58 +08:00
dailz closed this issue 2026-06-11 13:15:20 +08:00
Author
Owner

修复方案

根因分析

compute_line_entrycompute_visual_height 在渲染路径中直接调用 wrap_line_chars,未检查输入长度。当单行日志超过 10MB 时,逐字符遍历和 Vec 构建会冻结主线程。

此外 detect_level 在超长 JSON 上也会触发 O(n) 解析,以及 format_json_line 可能将 <10MB 的原始 JSON 展开为 >10MB 的 pretty-print 输出。

修复内容 (e99861c)

三层防护:

  1. Guard 1 — raw 输入检查:raw.len() > MAX_WRAP_INPUT_LEN 时跳过 detect_level 和 JSON 格式化,直接返回截断预览
  2. Guard 2 — post-format 检查:JSON 格式化后再次检查 display_text.len() > MAX_WRAP_INPUT_LEN
  3. progressive_reader 同步:后台索引器的 compute_line_visual_height 增加 post-format guard

改动文件:

  • crates/tui/src/app.rs — 双层 guard + truncate_to_columns
  • crates/core/src/io/progressive_reader.rs — post-format guard
  • crates/core/src/io/wrap.rs — 修正 docstring

测试:6 个新测试,全部 358 测试通过。

## 修复方案 ### 根因分析 `compute_line_entry` 和 `compute_visual_height` 在渲染路径中直接调用 `wrap_line_chars`,未检查输入长度。当单行日志超过 10MB 时,逐字符遍历和 Vec 构建会冻结主线程。 此外 `detect_level` 在超长 JSON 上也会触发 O(n) 解析,以及 `format_json_line` 可能将 <10MB 的原始 JSON 展开为 >10MB 的 pretty-print 输出。 ### 修复内容 (e99861c) **三层防护:** 1. **Guard 1** — raw 输入检查:`raw.len() > MAX_WRAP_INPUT_LEN` 时跳过 `detect_level` 和 JSON 格式化,直接返回截断预览 2. **Guard 2** — post-format 检查:JSON 格式化后再次检查 `display_text.len() > MAX_WRAP_INPUT_LEN` 3. **progressive_reader 同步**:后台索引器的 `compute_line_visual_height` 增加 post-format guard **改动文件:** - `crates/tui/src/app.rs` — 双层 guard + truncate_to_columns - `crates/core/src/io/progressive_reader.rs` — post-format guard - `crates/core/src/io/wrap.rs` — 修正 docstring **测试:6 个新测试,全部 358 测试通过。**
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/logViewer#26