前言¶
在 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