CMake编译Geant4调试时触发Abort() has been called报错排查
问题描述
通过CMake成功完成编译后,遇到如下问题:

调试运行时弹出Abort() has been called报错,点击Retry按钮后无任何响应,仅能收回命令行提示符控制权,直接在终端运行程序的输出如下:
(base) PS C:\geant4\build\Debug> toy_ex.exe ************************************************************** Geant4 version Name: geant4-11-00-patch-01 [MT] (8-March-2022) Copyright : Geant4 Collaboration References : NIM A 506 (2003), 250-303 : IEEE-TNS 53 (2006), 270-278 : NIM A 835 (2016), 186-225 WWW : http://geant4.org/ ************************************************************** (base) PS C:\geant4\build\Debug>
程序本身可正常运行,核心诉求是正确配置编译器的调试模式,以便后续基于Geant4开发扩展功能时可获取尽可能多的调试排查信息。
补充信息
以下是生成的.sln解决方案文件内容:
Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ALL_BUILD", "ALL_BUILD.vcxproj", "{864FDEB9-6432-307E-9AA5-54FC01B38A99}" ProjectSection(ProjectDependencies) = postProject {1B4B775D-725E-344B-8220-F2A19C0E8B19} = {1B4B775D-725E-344B-8220-F2A19C0E8B19} {5794228B-9573-38C7-9F64-CA83A5E015D5} = {5794228B-9573-38C7-9F64-CA83A5E015D5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TOY_EXAMPLE", "TOY_EXAMPLE.vcxproj", "{7C821F0C-2DA7-300C-9FB9-636C29E1D59D}" ProjectSection(ProjectDependencies) = postProject {1B4B775D-725E-344B-8220-F2A19C0E8B19} = {1B4B775D-725E-344B-8220-F2A19C0E8B19} {5794228B-9573-38C7-9F64-CA83A5E015D5} = {5794228B-9573-38C7-9F64-CA83A5E015D5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZERO_CHECK", "ZERO_CHECK.vcxproj", "{1B4B775D-725E-344B-8220-F2A19C0E8B19}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toy_ex", "toy_ex.vcxproj", "{5794228B-9573-38C7-9F64-CA83A5E015D5}" ProjectSection(ProjectDependencies) = postProject {1B4B775D-725E-344B-8220-F2A19C0E8B19} = {1B4B775D-725E-344B-8220-F2A19C0E8B19} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 Release|x64 = Release|x64 MinSizeRel|x64 = MinSizeRel|x64 RelWithDebInfo|x64 = RelWithDebInfo|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {864FDEB9-6432-307E-9AA5-54FC01B38A99}.Debug|x64.ActiveCfg = Debug|x64 {864FDEB9-6432-307E-9AA5-54FC01B38A99}.Release|x64.ActiveCfg = Release|x64 {864FDEB9-6432-307E-9AA5-54FC01B38A99}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 {864FDEB9-6432-307E-9AA5-54FC01B38A99}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 {7C821F0C-2DA7-300C-9FB9-636C29E1D59D}.Debug|x64.ActiveCfg = Debug|x64 {7C821F0C-2DA7-300C-9FB9-636C29E1D59D}.Release|x64.ActiveCfg = Release|x64 {7C821F0C-2DA7-300C-9FB9-636C29E1D59D}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 {7C821F0C-2DA7-300C-9FB9-636C29E1D59D}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 {1B4B775D-725E-344B-8220-F2A19C0E8B19}.Debug|x64.ActiveCfg = Debug|x64 {1B4B775D-725E-344B-8220-F2A19C0E8B19}.Debug|x64.Build.0 = Debug|x64 {1B4B775D-725E-344B-8220-F2A19C0E8B19}.Release|x64.ActiveCfg = Release|x64 {1B4B775D-725E-344B-8220-F2A19C0E8B19}.Release|x64.Build.0 = Release|x64 {1B4B775D-725E-344B-8220-F2A19C0E8B19}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 {1B4B775D-725E-344B-8220-F2A19C0E8B19}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 {1B4B775D-725E-344B-8220-F2A19C0E8B19}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 {1B4B775D-725E-344B-8220-F2A19C0E8B19}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 {5794228B-9573-38C7-9F64-CA83A5E015D5}.Debug|x64.ActiveCfg = Debug|x64 {5794228B-9573-38C7-9F64-CA83A5E015D5}.Debug|x64.Build.0 = Debug|x64 {5794228B-9573-38C7-9F64-CA83A5E015D5}.Release|x64.ActiveCfg = Release|x64 {5794228B-9573-38C7-9F64-CA83A5E015D5}.Release|x64.Build.0 = Release|x64 {5794228B-9573-38C7-9F64-CA83A5E015D5}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 {5794228B-9573-38C7-9F64-CA83A5E015D5}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 {5794228B-9573-38C7-9F64-CA83A5E015D5}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 {5794228B-9573-38C7-9F64-CA83A5E015D5}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {297A9E1A-FABA-3B58-9C68-28A09C508BAE} EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal
Visual Studio配置界面截图:
解决方案
报错本质是Geant4多线程默认配置和VS调试器的运行时库匹配冲突导致的,按以下步骤配置即可获得完整调试能力:
- 优先选择RelWithDebInfo编译配置
官方分发的Geant4预编译包默认使用RelWithDebInfo参数编译,直接选Debug配置会因为运行时库版本不匹配触发abort调用。RelWithDebInfo会开启O2优化同时生成完整PDB调试符号,支持断点命中、变量查看、调用栈追踪等全部调试功能,运行稳定性和Release版本一致,完全满足开发阶段调试需求。直接在VS顶部配置下拉框选择RelWithDebInfo|x64,右键解决方案重新生成即可。 - 必须使用纯Debug模式时重新编译Geant4依赖
自行编译Geant4源码阶段,在CMake配置时加上-DCMAKE_BUILD_TYPE=Debug参数,保证Geant4链接的调试版运行时库和你项目的Debug配置一致,编译完成后重新配置你的项目,链接到Debug版Geant4库即可解决abort报错。 - 调试阶段临时关闭Geant4多线程模式
不需要测试多线程逻辑时,可以在项目CMakeLists.txt中添加编译定义关闭MT模式:
单线程模式不会触发多线程调试的异常捕获逻辑,调试时可以直接拿到崩溃点的完整调用栈,不会出现点击Retry无响应的问题。add_compile_definitions(G4MULTITHREADED=0) - 配置VS调试器直接捕获异常
打开VS的调试->窗口->异常设置,勾选Win32 Exceptions分类下的所有C++异常,程序触发异常时会直接停在出错的代码行,不会弹出通用abort弹窗。
配置完成后可自行验证:在自定义的用户动作类中打一个断点,启动调试能正常命中断点、支持单步步进和变量查看即为配置生效。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

