Skip to content
Artwork for Andrej Karpathy的RSS订阅清单
Andrej Karpathy的RSS订阅清单 · Saturday · 5 min

Emacs原生编译快2.5到5倍,调试时却只剩一个函数名

一次由 Unicode 不换行空格触发的 Emacs 崩溃,暴露出原生编译带来的调试盲区:程序运行更快了,但错误堆栈可能只剩下出错函数名,无法定位到具体代码分支。 本期深度解析 cks 如何通过“重新求值”同一函数定义,临时切回可观察的 Lisp 执行形态,找回完整调用链与局部变量,最终定位 nil 值的真正来源。这不只是 Emacs 技巧,也是一条通用调试原则:排查问题前,先确认代码究竟以什么形态在运行。 原文链接: https://utcc.utoronto.ca/~cks/space/blog/programming/EmacsDebuggingStandardBits 原文标题:Notes on debugging standard and third-party Emacs code 主要内容: • 一个肉眼难辨的 U+00A0 不换行空格,会让 `goto-address` 触发 `wrong-type-argument` 错误。 • 原生编译通常可带来字节码约 2.5 到 5 倍的性能,但也会压缩调试信息,使堆栈难以精确指向源码位置。 • 在函数定义处执行 `C-M-x` 重新求值,无需修改代码,就能让该函数回到更易逐帧观察的 Lisp 版本。 • 完整堆栈和局部变量揭示了真正病灶:`bounds` 为 nil,继而让 `make-overlay` 收到无效参数。 • 宏展开会让调试器中的栈帧与源码表面结构不同;理解执行后的真实形态,才能正确解读调试信息。 推荐理由: 这篇文章把一个看似偶然的 Emacs 崩溃,拆解成“性能、编译形态与可观测性”之间的系统性问题。它提醒每位开发者:编译优化未必制造 bug,却可能让已有 bug 更难被看见。对于使用 Emacs、Lisp,或任何带 JIT/编译优化运行环境的开发者,都很有借鉴价值。建议结合原文阅读,了解作者实际的排查路径与操作细节。 --- 「Andrej Karpathy的RSS订阅清单」为您精选全球最前沿的AI技术博客文章,深度剖析技术背后的核心洞察。 由 voieech.com 提供技术支持。

0:00-5:38

transcript

No transcript — this publisher did not publish one.

show notes

一次由 Unicode 不换行空格触发的 Emacs 崩溃,暴露出原生编译带来的调试盲区:程序运行更快了,但错误堆栈可能只剩下出错函数名,无法定位到具体代码分支。

本期深度解析 cks 如何通过“重新求值”同一函数定义,临时切回可观察的 Lisp 执行形态,找回完整调用链与局部变量,最终定位 nil 值的真正来源。这不只是 Emacs 技巧,也是一条通用调试原则:排查问题前,先确认代码究竟以什么形态在运行。

原文链接:
https://utcc.utoronto.ca/~cks/space/blog/programming/EmacsDebuggingStandardBits
原文标题:Notes on debugging standard and third-party Emacs code

主要内容:

• 一个肉眼难辨的 U+00A0 不换行空格,会让 `goto-address` 触发 `wrong-type-argument` 错误。

• 原生编译通常可带来字节码约 2.5 到 5 倍的性能,但也会压缩调试信息,使堆栈难以精确指向源码位置。

• 在函数定义处执行 `C-M-x` 重新求值,无需修改代码,就能让该函数回到更易逐帧观察的 Lisp 版本。

• 完整堆栈和局部变量揭示了真正病灶:`bounds` 为 nil,继而让 `make-overlay` 收到无效参数。

• 宏展开会让调试器中的栈帧与源码表面结构不同;理解执行后的真实形态,才能正确解读调试信息。

推荐理由:
这篇文章把一个看似偶然的 Emacs 崩溃,拆解成“性能、编译形态与可观测性”之间的系统性问题。它提醒每位开发者:编译优化未必制造 bug,却可能让已有 bug 更难被看见。对于使用 Emacs、Lisp,或任何带 JIT/编译优化运行环境的开发者,都很有借鉴价值。建议结合原文阅读,了解作者实际的排查路径与操作细节。

---

「Andrej Karpathy的RSS订阅清单」为您精选全球最前沿的AI技术博客文章,深度剖析技术背后的核心洞察。
由 voieech.com 提供技术支持。