dsh-crash-triage:把 MLIR 崩溃收成可复现证据与转交报告

前言

在 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 维护者的报告草稿。

注意:

  1. 嵌套管线(如 func.func(a,b))在二分里算作一个顶层段,不会继续拆开。
  2. mlir-reduce 与上游 Tester 语义:本插件采用的 tester 约定与部分文档描述相反——tester 退出码 1 表示「仍interesting(仍同签名崩溃)」,退出码 0 表示不 interesting;协议异常会报 REDUCE_TESTER_PROTOCOL。
  3. 无符号化;极深嵌套可能导致 mlir-reduce 自身在调用 tester 前崩溃,表现为 REDUCE_FAILED 而非 REDUCE_UNSTABLE。
  4. 社区目录 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye