如何探索Common Lisp image的当前完整运行状态
Common Lisp Image 状态探索方法(SBCL + SLIME 环境)
内置通用方法
所有符合Common Lisp标准的实现都支持以下接口,可以直接调用:
- 查看所有已加载的包:执行
(list-all-packages),返回所有包对象的列表 - 查看单个包的完整信息:执行
(describe <包对象/包名>),比如(describe "CL")可以查看标准COMMON-LISP包的所有属性,包括昵称、依赖的包、被哪些包引用、导出符号列表等 - 遍历所有符号:可以通过
do-symbols(遍历包内所有符号,包含未导出的)、do-external-symbols(仅遍历对外导出的符号)宏自定义统计逻辑,比如统计每个包的导出符号数量、筛选特定属性的符号等 - 查看全局变量/函数绑定:执行
(describe <符号名>)可以查看单个符号的所有绑定信息,包括是否被定义为函数、变量、宏,对应的值/实现、文档字符串等
SLIME 自带交互工具
你使用的SLIME本身就提供了非常完善的可视化状态探索能力,不需要额外安装插件:
- 列出所有已加载包:按下快捷键*
C-c C-p L*,或者执行M-xslime-list-all-packages,会弹出独立buffer展示所有包,点击或回车可以进入对应包的符号列表,支持搜索、筛选,选中符号可以直接跳转到定义、查看描述 - 可视化对象检查器:按下快捷键*
C-c I*,或者执行M-xslime-inspect,输入你要查看的对象即可逐层浏览结构,比如输入(list-all-packages)就可以交互式浏览所有包的详情,输入*可以浏览所有全局变量的当前值,输入*package*可以查看当前包的完整信息 - 全局符号搜索:执行M-x
slime-apropos,输入空字符串即可列出整个image中的所有符号,支持按属性(函数/变量/类等)过滤,结果可交互操作
SBCL 专属扩展
SBCL本身提供了更多进阶的状态查询接口:
- 查看所有已加载的ASDF系统:执行
(asdf:already-loaded-systems),返回所有通过ASDF加载的第三方库/系统的名称列表 - 查看编译器配置:执行
(sb-ext:describe-compiler-policy)可以查看当前的编译器优化策略配置 - 查看内存占用分布:执行
(sb-ext:room)可以查看当前image中各类对象的内存占用情况,执行(sb-ext:gc :full t)先做全量GC后再查询结果会更准确 - 进阶内省接口:加载
sb-cltl2模块后,可以使用sb-cltl2:variable-information、sb-cltl2:function-information等接口查询符号的编译期声明信息
如果需要把完整状态导出为可存档的文本文件,可以运行以下代码:
(with-open-file (out "lisp-image-state.txt" :direction :output :if-exists :supersede) (format out "已加载包总数: ~a~%~%" (length (list-all-packages))) (dolist (pkg (sort (list-all-packages) #'string< :key #'package-name)) (format out "=== 包: ~a ===~%" (package-name pkg)) (format out " 昵称: ~{~a~^, ~}~%" (package-nicknames pkg)) (format out " 依赖包: ~{~a~^, ~}~%" (mapcar #'package-name (package-use-list pkg))) (format out " 被依赖包: ~{~a~^, ~}~%" (mapcar #'package-name (package-used-by-list pkg))) (format out " 导出符号数量: ~a~%~%" (let ((cnt 0)) (do-external-symbols (s pkg cnt) (incf cnt))))))
运行后会在当前工作目录生成lisp-image-state.txt文件,包含整个image的基础状态信息。
内容的提问来源于stack exchange,提问作者Gradient
相关产品推荐
相关产品推荐

