作者近期写 Jai 代码时遇到无智能感知(intellisense)的问题,Jai 是闭源测试语言,无人编写支持诸如“转到定义(goto definition)”等功能的扩展。缺乏智能感知让人难过,因能通过按 F12 转到任意函数对不熟悉的代码库很有帮助。作者觉得为 Jai 编写自定义语言服务器协议实现很艰巨,需解析代码来确定符号等,没时间和精力去做。
然后作者想到一个疯狂且可能糟糕的主意,即不解析 Jai 代码,而是利用编译器已生成的调试符号,理论上应能“完美”了解符号且适用于任何编译语言,最终实现了名为fts-lsp-pdb的 VSCode 扩展,提供了对产生.pdb 的任何语言的“转到定义”支持,但当前实现非常有限,只在函数调用上起作用,不支持内联函数或宏,只支持 Windows 和.pdb 文件,未在.dll 上测试,且需进行完整调试构建来生成.pdb,可能还有 bug。
文中还介绍了语言服务器协议(LSP)是微软为 VSCode 创建的开放标准,可让 IDE 向单独进程发送 JSON 消息以查询智能感知信息,但支持每种语言都需要大量工作,如各构建系统可能需修改语言服务器。Windows 调试符号通常存储在.pdb 文件中,MSVC 和 Clang/LLVM 都生成.pdb 文件以实现高质量调试,作者曾想利用 RAD Debugger 项目的代码来提供“转到定义”支持,但遇到问题,后改为用 Rust 实现新计划,即获取给定行的反汇编指令,找到函数调用,再用.pdb 将函数地址映射到源位置。
作者还分享了实现过程中的一些细节,如代码中的各种步骤和遇到的问题,如获取“target_address”时的困惑,以及在写 VSCode 扩展时的经历,包括使用 Microsoft 的LSP 样本项目和lsp-server crate
,还展望了未来,认为微软应创建“智能感知数据库”规范,让编译器生成和更新.idb 文件用于提供智能感知能力,长期希望将.idb 数据和完整源代码嵌入调试符号文件。同时提到使用调试符号进行智能感知的方法存在一些限制,如慢且昂贵的调试构建,以及在 Rust 中处理自引用结构时遇到的困难等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。