我看不到“全局字符串”
,我试着检查另一种类型,但效果很好。
另外,我尝试了本地字符串,我也可以看一下?!
答案 0 :(得分:5)
以防万一,此问题现在跟踪为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