前言¶
在 DSH 里让模型排查 MLIR / LLVM 管线崩溃时,常见情况是:日志里只有一大段 stderr,复现命令不完整,最小 IR 和「是哪一段 pass 挂的」都要人工再跑好几轮。dsh-crash-triage 是社区维护的工作流类插件,对外只暴露一个工具 crash_triage,按固定阶段调用 mlir-opt、mlir-reduce 和 Node 编写的 reducer tester,把一次崩溃整理成可复现命令、尽量缩小的 IR、失败 pass 线索、可选的 sanitizer 栈摘要,以及可直接转交的 report.md。
下面按定位、能力、安装配置、用法和边界说明如何使用。
这是什么¶
- 名称:
dsh-crash-triage(仓库 Rcyc-1025/dsh-crash-triage) - 维护者:Rcyc-1025
- 分类:工作流(DeepSeek Harness 插件目录:目录页)
- 版本(
package.json):0.1.2;许可证 MIT - 定位:DSH 插件;不编译 MLIR、不自动修 bug、不替你做符号化;sanitizer 报告由调用方提供或由运行环境产生。
插件设计上的一个约束是:缺工具、缺 IR、输出目录越界、超时或取消等情况不会向模型抛 ENOENT,而是返回 ok: false,并附带中文 hint 与 stage,便于智能体按阶段重试或改参数。
核心功能¶
crash_triage 支持四种 action(默认 diagnose):
| action | 作用 |
|---|---|
diagnose |
复现 → mlir-reduce 缩小 IR → pass 二分 → 写报告 |
reduce |
仅做 IR 最小化 |
bisect |
找出第一个导致崩溃的 pass |
parse |
只解析 sanitizer 报告,不调用 mlir-opt,不复现/缩小/二分 |
v1 明确不做:core dump、符号化、自动修 bug、任意 shell;只会以 argv 数组拉起 mlir-opt、mlir-reduce 和 tester 用的 node。
崩溃判定与稳定性:结合 sanitizer 输出、退出码/信号、输出中的 crash 标记等分类;对同一输入会最多跑 3 次(1 次 + 2 次重试),签名一致才标 stable: true。签名中的地址、PID、临时路径等会做归一化。
产物:在配置的 workDir(默认 .crash-triage)下按时间戳建目录,包含 input.mlir、各类日志、minimized.mlir / last-good.mlir、reproducer.txt、result.json、report.md 等。
环境与依赖¶
- Node.js:
^22.19.0 || >=24.0.0 - DeepSeek Harness:
>=0.2.1-rc.5 <0.3.0-0 mlir-opt(必需);mlir-reduce(最小化需要)。仓库在 LLVM 23.1.4 上做过验证。- 没有
mlir-reduce时插件仍可加载,但若请求最小化,diagnose与reduce会返回TOOL_NOT_FOUND;可在diagnose里传reduce: { enabled: false },仍可做复现与 pass 二分。
工具路径解析顺序:显式 mlirOptPath / mlirReducePath(无 PATH 回退)→ toolchainJson 或自动发现 <cwd>/mlir-lang/toolchain.json、<cwd>/toolchain.json → PATH。
安装与启用¶
安装命令以 README 为准(本地路径示例;目录内需含插件源码与自带的 cordis.patch.yml):
dsh plugin --profile desktop add ./dsh-crash-triage
卸载:
dsh plugin --profile desktop remove dsh-crash-triage
cordis.patch.yml 会自注册插件。在 workspace-write 沙箱里,profile 目录可能在 workspace 外,需要在普通终端安装,或按 DSH 提示提升权限。
安全与权限:插件以当前 dsh 进程权限运行,会读写 workspace 内路径并启动子进程。安装前请自行查看仓库源码与 MIT 许可证,确认 mlir-opt / mlir-reduce 来源可信。
配置要点¶
常用配置项(节选,默认值见 README):
| 键 | 默认 | 说明 |
|---|---|---|
timeoutMs |
120000 |
单个子进程超时 |
maxTotalMs |
900000 |
单次工具调用总预算 |
maxIrBytes |
33554432 |
输入 IR 上限,超限 IR_TOO_LARGE |
workDir |
'.crash-triage' |
产物根目录,相对 session cwd |
keepWorkDir |
true |
为 false 时仅在成功时清理产物 |
sanitizerMode |
'auto' |
auto / off / asan / ubsan |
环境变量可覆盖部分项,例如 CRASH_TRIAGE_TIMEOUT_MS、CRASH_TRIAGE_MAX_OUTPUT_BYTES、CRASH_TRIAGE_TOOLCHAIN_JSON。
调用参数除 action、irPath(相对 cwd)、stdin(内联 IR)、pipeline、passList、runnerArgs、outputDir(须留在 session cwd 内)外,还可嵌套 sanitizer、reduce、bisect、report 等对象。outputDir 若试图写到 workspace 外会触发 OUTPUT_DIR_ESCAPE。
返回里 status 可为 diagnosed / reduced / bisected / parsed / partial / failed;仅当请求的各个阶段都成功时 ok 为 true。diagnose 中最小化失败时仍可能继续 pass 二分,整体为 ok: false, status: "partial",并保留已完成阶段的结果。
典型用法¶
默认诊断:指定 IR 与优化管线字符串。
{ "irPath": "tests/crash.mlir", "pipeline": "builtin.module(func.func(canonicalize,cse),canonicalize)" }
只做 pass 二分:用顶层 pass 列表作为二分切分点。
{ "action": "bisect", "irPath": "tests/crash.mlir", "passList": ["func.func(cse)", "func.func(canonicalize)", "cse"] }
附带 AddressSanitizer 报告文件:
{ "irPath": "tests/crash.mlir", "sanitizer": { "mode": "asan", "reportPath": "logs/asan.txt" } }
仅解析内联的 sanitizer 文本:
{ "action": "parse", "sanitizer": { "inline": "==1==ERROR: AddressSanitizer: heap-use-after-free ..." } }
成功时响应体包含 reproducer.command、reproducer.text、reducer、bisect.failingPass(若适用)、artifacts.reportPath 等字段;失败时仍有 result.json / report.md,并带 error.code(如 NOT_REPRODUCED、FLAKY_CRASH、REDUCE_UNSTABLE、PASS_NESTED 等)。
适用场景与注意¶
适合:已在本地有 mlir-opt(及可选 mlir-reduce),在 DSH 会话里让模型系统性地复现 MLIR 崩溃、缩小 IR、定位 pass,并生成可发给 LLVM/MLIR 维护者的报告草稿。
注意:
- 嵌套管线(如
func.func(a,b))在二分里算作一个顶层段,不会继续拆开。 mlir-reduce与上游 Tester 语义:本插件采用的 tester 约定与部分文档描述相反——tester 退出码1表示「仍interesting(仍同签名崩溃)」,退出码0表示不 interesting;协议异常会报REDUCE_TESTER_PROTOCOL。- 无符号化;极深嵌套可能导致
mlir-reduce自身在调用 tester 前崩溃,表现为REDUCE_FAILED而非REDUCE_UNSTABLE。 - 社区目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本介绍事实均来自上述仓库 README 与
package.json。
结尾¶
dsh-crash-triage 把 MLIR 崩溃排查收成一条可交给模型执行的工作流:复现、缩小、二分与报告结构化输出,并尽量用结构化错误代替进程级异常。需要源码、配置全集与错误码列表时,以 GitHub 仓库为准:
- 目录页:https://www.skillhub.cn/plugins/Rcyc-1025/dsh-crash-triage
- GitHub:https://github.com/Rcyc-1025/dsh-crash-triage