C++编译Lua协程yield抛异常致CLion调试频繁暂停的解决及性能疑问
CLion 异常暂停过滤配置
操作步骤如下:
- 打开断点配置面板,快捷键为
Ctrl+Shift+F8(Windows/Linux)或Cmd+Shift+F8(macOS) - 在断点列表中找到 C++ Exceptions 分类下的
Any C++ exception项,右键选择「编辑断点」 - 在弹出的配置窗口中找到「按类型过滤」/「排除类型」配置项,添加
lua_longjmp到排除列表中(C++编译Lua默认抛出的协程、错误跳转异常均为该类型,若你自定义了Lua异常类型,替换为对应类型名即可) - 保存配置后重启调试即可,后续仅非Lua抛出的C++异常会触发调试暂停
频繁异常抛出的性能影响
性能损耗分两种场景:
- 无异常抛出的正常执行路径:现代编译器普遍实现了零开销异常机制,该场景下性能和
setjmp版本几乎无差异 - 异常抛出的执行路径:也就是你项目中每帧协程yield的场景,异常抛出+栈展开的开销远高于
setjmp直接跳转,高频触发下在游戏性能敏感场景、尤其是移动端低性能设备上会产生可观测的性能损耗
如果实际测试发现性能不符合预期,也可以在保留C编译Lua的前提下改造源码:将yield等控制流跳转的throw逻辑单独拆分,改用自定义跳转实现,仅在真正的错误场景保留异常抛出,兼顾C栈对象自动析构和运行性能。
内容的提问来源于stack exchange,提问作者rafoo
相关产品推荐
相关产品推荐

