架构设计
本章开头,我们介绍了调试器在软件开发全生命周期中的必要性,这一节我们将来分析在真实的开发、测试、线上环境中软件调试面临的诸多挑战,包括多平台兼容性、远程调试、安全隔离、性能影响等等。
为了应对这些挑战,现代调试器普遍采用前后端分离式架构,并支持前后端的独立扩展、演进,我们常将调试器划分为调试器前端和调试器后端:
- 前端可以划分为UI层和服务层:
- UI层可扩展:以方便支持不同的调试界面,如dlv命令行界面、gdlv图形界面或者VSCode中的可视化调试插件;
- 服务层可扩展:以方便支持本地调试(net.Pipe),或者远程调试(JSON-RPC),或者与更多的IDE进行集成(DAP协议);
- 后端可以划分为服务层、符号层、目标层:
- 服务层可扩展:略
- 符号层可扩展:可支持不同的文件格式(ELF,PE,MachO)、不同的调试符号信息(DWARF,COFF,Stabs)、不同编程语言(Go,C,C++,Rust);
- 目标层可扩展:可支持不同的操作系统(Windows,Linux,macOS),不同的硬件平台(amd64,arm64,powerpc);
OK,让我们一起了解下现代调试器面临的挑战,以及如何通过合理的架构设计来解决这些问题吧。Let's Go!