C++库设计:如何支持上层调试应用开发且不暴露额外公开API
问题描述
我希望基于自有C++库开发适配测试、调试等场景的调试应用,但不希望向终端用户暴露非必要的额外API。
举例来说,若需开发一款向终端用户可视化展示程序插件对库调用情况的应用,在无法使用携带调试信息的Release构建版本运行GDB、LLDB等标准调试器的前提下,应当如何设计对应的库与调试应用架构?
限制条件
- 必须兼容Windows平台(MSVC-2015)与Linux平台(GCC-8)
- 仅允许使用C++11标准
- 发布给终端用户的版本不可携带调试信息
- 程序运行时不可生成core dump文件
- 不可为调试需求新增额外公开API
预期需求(若可行)
- 若无其他实现路径,在不新增public/protected API的前提下访问库核心类的私有成员即可满足需求。
参考可行方案
可在库的核心类中引入额外符号,将调试类声明为核心类的友元,核心类头文件示例代码如下:
class MyClassPrivate; class MyClass { public: friend class MyClassDebugger; int value() const; private: friend class MyClassPrivate; std::unique_ptr<MyClassPrivate> impl_; };
交付时向普通终端用户仅导出公开类头文件,类私有头文件不随公开版本分发。调试场景下,拿到私有头文件后仅需定义MyClassDebugger符号即可访问MyClass的私有实现,调试程序示例代码如下:
class MyClassDebugger { public: void modify(MyClass& object) { object.impl_->value = 100; } }; int main() { MyClass object; MyClassDebugger().modify(object); std::cout << object.value() << std::endl; }
内容的提问来源于stack exchange,提问作者Ghasem Ramezani
相关产品推荐
相关产品推荐

