ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

scope-capture 两大进阶技巧:捕获动态 Var 与“远距离间谍“only-from 条件触发

scope-capture 两大进阶技巧:捕获动态 Var 与“远距离间谍“only-from 条件触发 scope-capture 两大进阶技巧捕获动态 Var 与远距离间谍only-from 条件触发【免费下载链接】scope-captureProject your Clojure(Script) REPL into the same context as your code when it ran项目地址: https://gitcode.com/gh_mirrors/sc/scope-capturescope-capture是一个 Clojure(Script) REPL 调试神器通过sc.api/spy和sc.api/brk两个宏把代码运行时脚下的现场局部变量、动态绑定快照下来再用letsc/defsc在 REPL 里原样复现。本文讲解它的两大进阶技巧① 用:sc/dynamic-vars选项捕获动态 Var 绑定② 用calling-from:sc/called-from内部即 only-from 条件只在特定调用链触发间谍过滤掉调试噪音。快速回顾spy 如何工作先把sc.api加载进环境推荐放在 Leiningen 的:userprofile见 README.md(require sc.api)在代码中某处插入(sc.api/spy 表达式)后每次求值都会记录一个 Execution Point执行点正整数 IDREPL 中即可用它重建现场。示例见 lab/sc/lab/example.cljc完整流程见 doc/Tutorial.md。技巧一捕获动态 Var:sc/dynamic-vars普通的spy只会记录词法局部变量。而*out*、日志上下文、请求属性这类动态作用域的值必须显式声明才会被捕获(sc.api/spy {:sc/dynamic-vars [*out* my.app/*foo*]} expr)要点spy和brk都支持该选项选项说明见 src/sc/api.cljc捕获信息可通过(sc.api/ep-info ep-id)查看动态绑定在:sc.ep/dynamic-var-bindings键下复现现场时sc.api/letsc会用binding重新绑定这些动态 Var而sc.api/defsc不会它只def普通 Vars需要动态环境时请优先用letsc或子 REPL(sc.repl/ep-repl ep-id)。这个能力在调试 Web 服务、数据库连接等难以手工伪造的运行时状态时尤为关键。技巧二远距离间谍——only-from 条件触发假设通用函数f被很多地方调用但 Bug 只在从g调用时出现。直接在f里放spy绝大多数记录都是噪音。解决办法给间谍下条件触发指令只有当调用来源匹配时才记录。第 1 步在f的间谍处声明只关心来自:foo的调用(defn f [x] (sc.api/spy {:sc/called-from :foo} ...))第 2 步用sc.api/calling-from在源头g里标记调用来源(defn g [] (sc.api/calling-from :foo (f ...)))原理是calling-from会把动态 Varsc.api.from/*caller*绑定到指定值定义在 src/sc/api/from.cljc间谍点运行时实现层用should-capture?把*caller*与:sc/called-from期望值比较不相等就直接跳过记录——这个比较值在源码中就叫only-from见 src/sc/impl.cljc。效果无论f被调用多少次只有来自g的那一次执行点会被保存日志干净、内存友好。配合sc.api/disable!还能整点关闭某个代码位的间谍行为。收尾别让间谍常驻调试完成后删除 spy 调用并(sc.api/dispose! ep-id)释放内存间谍进生产会造成内存泄漏两个技巧可以叠加在条件触发的间谍上同时声明:sc/dynamic-vars更多姿势无表达式 spy、错误才触发、合并多个现场等见 doc/Tips-and-Tricks.md。 想上手试试克隆仓库 https://link.gitcode.com/i/3150269b753d391e686f472821872aba 后运行 lab/ 下的示例即可体验。【免费下载链接】scope-captureProject your Clojure(Script) REPL into the same context as your code when it ran项目地址: https://gitcode.com/gh_mirrors/sc/scope-capture创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表