【问题标题】:C++ Debug Window showing "<incomplete type> for string variableC++ 调试窗口显示“<incomplete type> for string variable
【发布时间】:2018-03-28 16:26:53
【问题描述】:

据我所知,我正在以一种相当正常的方式初始化字符串,当我调试时,我的 IDE (CLion) 中的变量窗口将其值显示为&lt;incomplete type&gt;。我有一些简单的代码会导致字符串变量 Bob 出现问题。

#include <iostream>

int main() {
    std::string Bob = "this doesn't show up in the variables window";
    std::cout << Bob << std::endl;
    return 0;
}

我不知道它有什么影响,但我会包含我可以使用的最简单的 CMakeLists 文件。

cmake_minimum_required(VERSION 3.8)
project(testing123)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11"}

set(SOURCE_FILES main.cpp)
add_executable(testing123 ${SOURCE_FILES})

set(CMAKE_CXX_COMPILER "/cygdrive/c/cygwin64/bin/clang++")
set(CMAKE_C_COMPILER "/cygdrive/c/cygwin64/bin/clang++")

我查看了其他问题,它们都与我看不到直接相关的类和指针有关,所以如果他们要为此负责,我希望能解释一下这将如何是。

【问题讨论】:

  • 我们无法尝试编译上述内容,因为(对于初学者)我们没有各种#include 文件。请发布一个最小的、完整的、可验证的程序。*.com/help/mcve
  • 我已经发布了一些可以复制问题而没有多余内容的内容。
  • #include &lt;string&gt; ?
  • 不幸的是 #include &lt;string&gt; 似乎没有效果,马特

标签: c++ c++11 debugging clion incomplete-type


【解决方案1】:

您可能需要使用_GLIBCXX_DEBUG macro 设置debug mode

您可以在 CMakeLists.txt 文件中使用以下行来执行此操作:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG")

【讨论】:

    【解决方案2】:

    使用带有调试符号的标准库

    在 Linux 上,与使用 _GLIBCXX_DEBUG 重新编译整个源代码相比,一种侵入性较小的方法是定义

    LD_PRELOAD=/usr/lib/x86_64-linux-gnu/debug/libstdc++.so.6
    

    用于您的调试器或 IDE。您可能需要通过安装它

    sudo apt install libstdc++6-8-dbg
    

    首先。在 Ubuntu 上,我通过 Snap 获取 CLion,然后我将 /snap/bin/clion 处的符号链接替换为包含

    的文件
    #!/bin/bash
    LD_PRELOAD=/usr/lib/x86_64-linux-gnu/debug/libstdc++.so.6 /usr/bin/snap run clion "$@"
    

    现在我可以看到字符串的内容,至少在 LLDB 中(我没有尝试过 GDB)。

    破解

    对于 GDB,无需任何准备的快速解决方法是将字符串强制转换为 char*

    (gdb) p (char*) my_string
    $13 = 0x2058970 "These are the contents"
    

    这也适用于开箱即用的 CLion。

    【讨论】:

      最近更新 更多