MSVC 32位Release模式下Boost栈追踪为空问题求助
MSVC 32位Release模式下Boost Stacktrace栈追踪为空问题分析
问题背景
在Qt Creator中实现异常栈追踪功能,使用boost::stacktrace::to_string(boost::stacktrace::stacktrace()),该代码在MingGW 32/64位、MSVC 64位环境下均正常,但MSVC 32位Release模式下栈追踪为空。当前Release模式的编译链接参数如下:
编译宏定义
DEFINES = -DUNICODE -D_UNICODE -DWIN32 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DWIN64 -DQT_NO_DEBUG -DQT_CORE_LIB -DNDEBUG
C编译参数
CFLAGS = -nologo -Zc:wchar_t -FS -Zc:strictStrings -O2 -Zi -MD -W3 -w44456 -w44457 -w44458 /Fdrelease\pruebastack4.vc.pdb $(DEFINES)
C++编译参数
CXXFLAGS = -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -O2 -Zi -MD -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc /Fdrelease\pruebastack4.vc.pdb $(DEFINES)
头文件路径
INCPATH = -I..\pruebastack4 -I. -I../src -Iz:\zlib\common\src -Iz:\zlib\devices\src -IZ:\boost\boost_1_82_0 -I........\Qt\Qt5.12.11\5.12.11\msvc2017_64\include -I........\Qt\Qt5.12.11\5.12.11\msvc2017_64\include\QtCore -Irelease -I........\Qt\Qt5.12.11\5.12.11\msvc2017_64\mkspecs\win32-msvc
链接参数
LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /OPT:REF /INCREMENTAL:NO /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'"
问题原因分析
1. 编译宏定义冲突
DEFINES中同时存在WIN32和WIN64,这是明显的配置错误。32位MSVC编译时必须移除WIN64宏:
- Boost Stacktrace内部会根据
WIN64宏选择64位栈遍历逻辑,32位环境下该逻辑完全不兼容,直接导致无法捕获栈帧。
2. Qt依赖路径不匹配
INCPATH中引用的是msvc2017_64(64位Qt)的头文件,但当前编译的是32位程序:
- 混合64位头文件会导致编译逻辑混乱,部分平台相关的宏定义错误,间接影响栈追踪功能的正常工作。需改为32位Qt对应的路径(如
msvc2017)。
3. 链接优化选项导致符号丢失
链接参数中的/OPT:REF会自动移除未被直接引用的符号:
- 栈追踪依赖的调试符号可能被误优化删除,32位环境下该选项的影响比64位更显著。可尝试临时改为
/OPT:NOREF测试,或确保栈追踪相关符号被保留。
是否为Boost Bug?
目前来看,配置错误的可能性远大于Boost自身Bug。先修正上述3项配置问题后重新测试,若问题仍存在,再排查Boost 1.82版本针对32位MSVC Release模式的已知问题。
内容的提问来源于stack exchange,提问作者niko101a3
相关产品推荐
相关产品推荐

