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
羽毛球分组比赛记分
小程序二维码

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

小夜