如何在Chez Scheme中定位引发异常的具体代码行位置
Chez Scheme定位未绑定变量报错位置的方法
问题场景
使用Chez Scheme REPL加载单文件千行规模的Scheme代码时,执行加载指令后触发未绑定变量报错:
(load "filexxx.scm")
报错输出如下:
Exception: variable A is not bound
Type (debug) to enter the debugger.
日常使用Racket/DrRacket时环境会直接指向报错代码行,需要Chez Scheme下的等效定位方案,找到引用未定义变量A的具体文件与行号。
具体操作方法
- 直接使用报错提示的内置调试器:报错触发后不要关闭当前REPL会话,直接输入
(debug)进入交互调试模式,调试器会首先输出当前异常触发点的完整源码位置,包含所属文件路径、行号、列号,同时打印出错位置周边的代码片段,定位精度和DrRacket的报错提示一致。 - 多文件嵌套加载时用栈回溯找源头:如果是多个文件互相
load依赖的场景,进入调试器后输入bt指令打印完整调用栈,栈中每一个调用帧都会标注对应的源文件与行号,从栈顶向下排查就能找到最初引用未定义变量A的代码位置,不会被嵌套加载逻辑干扰。 - 提前开启源码追踪实现报错直接带行号:如果不想每次报错后进调试器,可以在加载文件前开启源码位置追踪参数,用如下形式加载文件:
该模式下加载过程触发的所有异常,都会直接在报错信息里附带出错的文件和行号,不需要额外进入调试器就能拿到定位信息。(parameterize ([compile-profile 'source]) (load "filexxx.scm")) - 预编译文件注意保留调试信息:如果加载的是提前编译生成的
.so字节码文件,编译时不要加剔除调试元信息的参数,否则会丢失源码位置映射,无法正常输出行号。
内容的提问来源于stack exchange,提问作者brj
相关产品推荐
相关产品推荐

