以防万一,该问题现在被追踪为CPP-8693.
根本原因与libstdc ++ dual ABI有某种关联.std::string
类型的全局符号被不同地修改,这反过来混淆了GDB.
在GCC 5.1版本的libstdc ++引入了一个新的库ABI,其包括新的实现方式
std::string
和std::list
.这些更改对于符合2011 C++标准是必要的,该标准禁止写入时写入字符串并要求列表跟踪其大小.
给出以下代码:
std::string global_var = "Hi there!"; static std::string static_var = "Hello";
这是相关的nm
输出:
0000000000602240 B _Z10global_varB5cxx11 0000000000602280 b _ZL10static_var
一种可能的解决方法是禁用C++ 11 ABI.在CMakeLists.txt中,在行后面添加以下set(CMAKE_CXX_STANDARD 11)
行(如果有):
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
这使得符号名称被不同地修改,以某种方式GDB再次开心:
0000000000602238 B global_var 0000000000602248 b _ZL10static_var