本文档描述 Cheat Engine 功能语义在 DogeDebugger C#/.NET 10/WPF 架构中的落地方式。
约束如下:
- 使用现有 C# 项目结构和 WPF 布局。
- 不使用反编译工具生成的混淆标识符作为新代码命名。
- 不新增
Test类型。 - CE 的底层行为、数据含义和实时状态作为实现基线。
- 不复制 CE 的品牌、可识别文案、视觉特征或外部发布信息。
- 原版
DogeDebugger.dll的运行行为只用于校验,不把旧文档当作实现依据。
| 层级 | C# 实现 | 职责 |
|---|---|---|
| WPF 外壳 | MainWindow、UI/Views、UI/ViewModels |
菜单、AvalonDock 布局、面板、对话框和实时绑定 |
| 会话层 | DebuggerSession |
统一暴露目标进程、调试器、断点、内存、RTTI、Mono 和指令访问状态 |
| 调试器层 | UserModeDebugger |
Windows 调试事件循环、暂停、继续、单步、异常和中断 |
| 断点层 | SoftwareBreakpointManager、HardwareBreakpointManager |
软件断点、硬件断点、命中规范化、恢复和重新武装 |
| 访问监视层 | InstructionAccessWatchManager、InstructionAccessWatch |
WatchId 生命周期、记录队列、地址聚合和实时快照 |
| MCP 层 | Core/AI/DebuggerMcpTools.cs |
把同一会话状态暴露为可查询、可执行工具 |
| CE 侧参考 | C# 侧实现 | 语义 |
|---|---|---|
debughelper.pas |
BreakpointEntry、SoftwareBreakpointManager |
断点注册、原始字节、命中恢复、重新安装 |
debugeventhandler.pas |
UserModeDebugger |
调试事件、异常、断点、单步和继续 |
FoundCodeUnit.pas |
InstructionAccessWatchManager、InstructionAccessWatchViewModel |
指令访问记录、值读取、计数和界面状态 |
frmChangedAddresses.pas |
InstructionAccessWatchWindow |
指令访问窗口及实时列表 |
MemoryBrowserFormUnit.pas |
DisassemblyView |
反汇编右键菜单和指令访问入口 |
LuaHandler.pas、CE MCP bridge |
DebuggerMcpTools |
调试状态和操作的程序化入口 |
映射时保留行为语义,但不直接复用 CE 的过程名、类名、控件名或品牌标识。
- 反汇编视图从当前指令读取内存操作数。
InstructionMemoryOperand保存操作数索引、显示文本、默认值大小和 Mono 基址寄存器。InstructionAccessWatchManager.Start创建稳定WatchId。- 监听使用内部软件断点,并保存指令原始字节。
UserModeDebugger收到软件断点异常。- 按异常地址解析真实断点,内部监听断点不进入普通用户断点流程。
InstructionAccessWatchManager解析操作数最终访问地址。- 读取目标内存并生成
InstructionAccessRecord。 - 记录按
WatchId进入队列,由排空计时器合并为 UI 快照。
记录字段包括:
WatchId- 指令地址
- 访问地址
- 值大小
- 读取是否成功
- 值
- Mono 基址寄存器与地址
- 线程号
- 首次出现时间和最后出现时间
- 命中次数
InstructionAccessWatchViewModel 不直接读取调试器内部字典,只消费 InstructionAccessWatchSnapshot:
- 摘要数量来自快照的
AddressCount - 行地址、值、次数来自快照记录
- 16 进制与 10 进制切换只改变显示,不改变底层值
- 值大小切换清空旧结果并更新监听过滤
- 选中行变化同步刷新复制、RTTI、数据视图和 Mono 菜单状态
- 窗口关闭或停止时移除内部断点并恢复原始字节
- 窗口和面板尺寸使用稳定的
Width、Height、MinWidth、MinHeight。 - 表格列宽使用固定宽度或
*,避免实时值变化引起布局跳动。 - 字体样式使用项目现有 UI 字体资源;代码和地址列使用
Consolas或Cascadia Code。 - 行选择优先使用控件选择和模式 API,不依赖屏幕坐标。
- 右键菜单必须处理真实鼠标所在行,再刷新菜单可用状态。
- 实时列表只允许从快照更新,不允许 UI 直接修改断点内部状态。
- 必须打开目标进程后才能执行附加。
- 必须附加调试器后才能创建指令访问监听。
- 监听创建、命中、停止、重新附加和进程切换都必须回到同一个状态源。
- 暂停状态、当前线程、IP 和寄存器必须来自调试器实际上下文,不能在 UI 层猜测。
- 调试事件循环退出时,必须同步清理监听、断点和窗口状态。
每次改动后至少执行:
& 'D:\Microsoft Visual Studio2026\Community\MSBuild\Current\Bin\MSBuild.exe' `
'src\DogeDebugger.sln' /m /t:Build /p:Configuration=Release /p:Platform=x64 /v:minimal运行验证必须覆盖:
- 启动目标进程。
- 打开并附加目标进程。
- 在带内存操作数的指令上创建监听。
- 观察到
totalRecordCount、addressCount、值和次数增长。 - 在监听窗口中观察到同一地址行实时变化。
- 停止监听后确认断点移除、原始字节恢复、UI 状态变为停止。
只通过编译、只看到窗口、或只得到空记录,都不能作为功能完成证明。