更新

2024-07-05 本书已经出版 image 由于本库的草稿是我之前一个人写的,所以质量和正确性都不如经过两位作者和出版社编辑审阅和校正过的书稿。 如果你想阅读更加完善的版本,推荐购买正版书籍。

自动化符号匹配

至此,我希望你相信调试符号需要匹配来让调试器变得有用。没有它,调试器要么拒绝一个用户的请求,或者更糟的是给出不正确的答案。在原则上找到包含匹配符号的文件不是有挑战性。但是如果产品包含很多模块和很多发布版本、服务包,热修复和补丁要支持,它可以是繁琐和错误频出的。自动化找到正确调试符号文件是更容易的。

Windows符号服务器就是这样的工具,这个点子很简单。它开始于在一个服务器,被叫做符号存储,安装调试符号文件。文件会适当按照一些参数,如时间戳,checksum, 文件大小等等排序和索引。每个文件有不同的版本不同的索引,用来快速搜索。当符号存储创建后,用户可以设置符号搜索路径来包含符号存储。调试器接着会自动通过符号服务器拿到正确版本的符号文件。符号存储可以通过公司的LAN网络访问或者全世界的互联网来访问。作为一个例子,下面的符号搜索路径指向windows的所有系统dll的在线符号服务器。第一个星号的路径指向一个下载过的文件的本地缓存。如果已经下载过,它会加速已经下载过的符号文件的搜索速度。第二个星号之后的URL指向微软的公开下载网址。

SRV*D:\Public\WinSymbol*http://msdl.microsoft.com/download/symbols

有了符号服务器的帮助,开发人员不再需要摸索正确的符号文件。不幸的是,在Linux或者UNIX上没有相似的工具。但是,基本原理是使用的。写一个脚本自动化搜索是不困难的。比如,当各种版本的二进制安装在文件服务器的某个地方,这个脚本可以创建一个临时的文件夹,找到具有匹配调试符号的正确二进制,然后创建软链接到这些临时文件夹。调试器gdb可以设置映射原来的二进制搜索路径到这个新的临时文件夹,从而得到匹配的符号。

(XT: 如今Linux上已经有类似的工具,debuginfod,感兴趣可以网上搜索资料)