在范围结束时将断点放置以检查局部变量的值是检查值的最简单方法,因此我们不想执行耗时的println调试方法,如果可能的话。
变量的调试信息由该变量可见的程序中的一系列PC范围以及每个范围内变量的寄存器中的位置。 在这些范围之外,该变量的值尚不清楚。 这是编译器做出的决心,调试器只是向您展示其在调试信息中写的内容。注意,调试信息能够表明一个变量是在某些范围的PC登记册中,然后转到堆栈中的另一个范围,然后返回寄存器等。因此,如果编译器正确地发布了调试信息,则可以通过调试器跟踪这样的动作。 我不知道为什么生锈的编译器认为在该功能的末尾``a'仍然处于范围中,而`b'不是。 但是,大多数语言都无法保证变量的存储在变量的定义的整个语义范围内,以及使用ARC或其他技术来管理对象生命周期的语言通常喜欢在引用它们的最后一个代码后摆脱变量,因为它们使它们具有更高的内存有效的效率。 因此,通常,您只保证能够在变量上次使用之前查看。 大多数c编译器在-O0上运行时不会以这种方式重复使用变量的堆栈空间。 但是,例如,在Swift中,编译器添加了一个“阴影变量”,该“阴影变量”仅在Optimizer关闭并生成调试信息时才发出,该信息用于人为地延长变量的寿命。 那是围绕Swift变量开垦的渴望工作的最干净的方式。 也许生锈需要类似的东西?
tl; dr是,这是必须在生锈编译器中固定的东西。 编译器告诉我们,它不知道您当前的PC在哪里,并且调试器绝不应该猜测价值,最终造成的弊大于商品。