Files
StellarX-kaifa/开发记录/BUG/BUG-20260109-0001-TextBox-setText进入事件循环前调用崩溃.md

2.5 KiB
Raw Permalink Blame History

BUG-20260109-0001

适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。

基本信息

  • ID: BUG-20260109-0001
  • 标题: TextBox::setText 进入事件循环前调用崩溃
  • 状态:已修复
  • 严重性:S1
  • 优先级:P0
  • 模块: TextBox
  • 版本 / 分支: v2.3.2(基础版 EasyX + Win32)
  • 环境: Windows 10/11 x64 + Visual Studio 2022(MSVC)Debug / Release
  • 发现人: 用户
  • 关联 Fix ID: Fix-BUG-20260109-0001

问题描述

  • 现象: 在 Window 尚未创建或图形上下文尚未初始化时调用 TextBox::setText() 设置默认文本,会触发 TextBox::draw(),进而进入依赖 EasyX 图形上下文的绘制 / 抓屏逻辑,导致访问冲突或中断。
  • 影响范围: 所有“先创建控件并设置默认文本,再创建 Window / 挂载控件树”的初始化流程。
  • 期望结果: setText() 只更新控件状态并标记需要重绘,不应在生命周期未就绪时主动绘制。
  • 实际结果: setText() 内部直接调用 draw(),绘制链路在图形上下文未就绪时崩溃。

复现信息

  • 前置条件:[可选] Window / EasyX 图形上下文尚未初始化。
  • 复现步骤:
  1. 在创建 Window 或首次 draw() 前创建 TextBox。
  2. 调用 TextBox::setText() 设置默认文本。
  3. 随后才创建 Window 或将 TextBox 添加到 Canvas / Window。
  4. 观察程序在 setText() 阶段崩溃。
  • 复现概率:必现
  • 最小复现 Demo:
Window window(1024, 768, NULL, RGB(255, 255, 255), "StellarX Application");

auto initLibPathBox = std::make_unique<TextBox>(230, 230, 700, 30);
initLibPathBox->setText("textText");

window.addControl(std::move(initLibPathBox));
window.draw();
return window.runEventLoop();
  • 证据:PDF 历史记录描述 setText() 触发 draw() 后进入 saveBackground() / getimage() 等图形上下文相关逻辑。

初步分析

  • 疑似位置: TextBox::setText()
  • 触发条件: 控件属性设置发生在 Window 绘制 / EasyX 图形上下文初始化之前。
  • 相关线索:
    • setter 不应带有依赖图形上下文的即时绘制副作用。
    • draw() 会进入背景快照与图像抓取链路。
  • 最近相关改动:[可选]

跟踪信息

  • 首次发现时间: 2026-01-09
  • 最后更新时间: 2026-09-19(从 PDF 整理入库)
  • 修复版本: v3.0.0
  • 验证版本:[可选] v3.0.0
  • 备注:[可选] 来源原始 ID 为 BUG-20260109;同日另有 Table 重影问题,入库时按顺序拆为 0001 与 0002。