在 VS 代码中使用 gcc 无法看到 std::vector 的元素

Posted

技术标签:

【中文标题】在 VS 代码中使用 gcc 无法看到 std::vector 的元素【英文标题】:Unable to see elements of std::vector with gcc in VS code 【发布时间】:2019-06-30 22:46:05 【问题描述】:

我目前正在使用 VS Code 来学习 C++,因为它易于设置并且比 VS Studio 轻得多。但是,我无法做的一件事是在调试模式下查看数组(或字符串等)的元素。

我在这里搜索了解决方案,似乎启用漂亮打印可以解决问题,但不幸的是它没有(我安装了 Python 3.6)。 我也尝试过使用 VS Studio 编译器和调试器,但无法让它按照我想要的方式工作(基本上点击 F5 编译单个 cpp 文件,无需更改任何选项,只需单击一下)。

你们能帮我解决这个问题吗?我目前在 Windows 10 上使用 MinGW 编译器,带有以下任务文件:

"version": "2.0.0",
"tasks": [
    
        "label": "echo",
        "type": "shell",
        "command": "g++",
        "args": [
            "-g", "$relativeFile", "-o", "example"
        ],
        "group": 
            "kind": "build",
            "isDefault": true
        
    
]

并启动:

"version": "0.2.0",
"configurations": [
    
        "name": "(gdb) Launch",
        "type": "cppdbg",
        "request": "launch",
        "program": "$workspaceFolder/example.exe",
        "args": [],
        "stopAtEntry": false,
        "cwd": "$workspaceFolder",
        "environment": [],
        "externalConsole": true,
        "MIMode": "gdb",
        "miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe",
        "preLaunchTask": "echo",
        "setupCommands": [
            
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            
        ]
    
]

提前致谢!

【问题讨论】:

我在我的 Mac 上遇到了完全相同的问题。看起来像 VS Code 中的错误 但是您找到解决方法了吗?也许与另一个调试器? _我试过这个link 但没有发现它有帮助 我的解决方法是查看向量内部。添加一个手表并输入如下内容:(int(*)[5])ints._M_impl._M_start(我使用的是不同的 STL 实现,所以我的表达方式有点不同)。 _M_start 指向向量内的存储。将其转换为数组,您将获得元素 【参考方案1】:

对我来说这是可行的,但首先检查您是否有 'c:\msys64\mingw64\share\gcc-8.3.0\python''c:\usr\share\gcc-8.3.0\python' 文件夹并调整 sn-p

launch.json
...
            "setupCommands": [
                
                    "description": "Enable pretty-printing for gdb",
                    "text": "python import sys;sys.path.insert(0, 'c:\\msys64\\mingw64\\share\\gcc-8.3.0\\python');from libstdcxx.v6.printers import register_libstdcxx_printers;register_libstdcxx_printers(None)",
                    "ignoreFailures": false
                ,
                
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                
            ],
...

【讨论】:

这对我有用,只是将 python 路径更改为 /usr/bin/python(用于远程 linux 调试)【参考方案2】:

我在 Windows 上使用 MinGW 时也遇到了类似的问题。

当我删除 MINGW 并改为安装 mingw-w64 时,问题已解决。

【讨论】:

“Mingw-w64 是原始 mingw.org 项目的改进,旨在支持 Windows 系统上的 GCC 编译器。”如网站上所述。【参考方案3】:

对于Windows

如果您在调试时只看到 STL 容器的内存地址,那么您可能使用的是 x64 Windows。

我找到了一个有效的解决方案,在 x64 Windows 中安装 MinGW 时,安装 i686 (win32) 版本的 MinGW(此评论底部给出其官方下载链接)而不是 x86_64 版本,见下文:

win32版MinGW下载:

i686-posix-dwarf

我刚刚把下载的文件解压到文件夹D:\MinGW,然后将MinGW的bin路径D:\MinGW\i686-8.1.0-release-posix-dwarf-rt_v6-rev0\mingw32\bin添加到环境系统变量PATH中。

相关配置文件如下:

.vscode\tasks.json


    "tasks": [
        
            // "type": "shell",
            "label": "C/C++: g++.exe build active file",
            "command": "g++",
            "args": [
                "-g",
                "$file",
                "-o",
                "$fileDirname\\$fileBasenameNoExtension.exe"
            ],
            "options": 
                "cwd": "$workspaceFolder"
            ,
            "problemMatcher": [
                "$gcc"
            ],
            "group": 
                "kind": "build",
                "isDefault": true
            
        
    ],
    "version": "2.0.0"

.vscode\launch.json


    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.    
    "version": "0.2.0",
    "configurations": [
        
            "name": "g++.exe - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "$fileDirname\\$fileBasenameNoExtension.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "$workspaceFolder",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "gdb",
            "setupCommands": [
                   // Display content in STL containers pretty
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                
            ],
            "preLaunchTask": "C/C++: g++.exe build active file"
        
    ]

.vscode\c_cpp_properties.json


    "configurations": [
        
            "name": "Win32",
            "includePath": [
                "$workspaceFolder/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.19041.0",
            "compilerPath": "g++", // Or complete absolute path "D:/MinGW/i686-8.1.0-release-posix-dwarf-rt_v6-rev0/mingw32/bin/g++.exe"
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x86"
        
    ],
    "version": 4

我的电脑环境

VSCode Version: 1.53.2 (system setup)
OS Version: Windows 10 x64 (Windows_NT x64 10.0.19041)
MinGW version: i686-8.1.0-release-posix-dwarf-rt_v6-rev0
GDB version: 8.1.0 (Target: i686-w64-mingw32)

最初发布于https://github.com/microsoft/vscode-cpptools/issues/3921#issuecomment-780379258。

希望对你有帮助。

【讨论】:

这很好用【参考方案4】:

我使用的方法就像上面描述的 Georgy。

*((int(*)[10])array._M_impl._M_start)

Debug console output:
-exec p array
$7 = <std::_Vector_base<int, std::allocator<int> >> = _M_impl = <std::allocator<int>> = <__gnu_cxx::new_allocator<int>> = <No data fields>, <No data fields>, _M_start = 0x2924cb0, _M_finish = 0x2924cd8, _M_end_of_storage = 0x2924cf0, <No data fields>

-exec p *((int(*)[10])array._M_impl._M_start)
$8 = 41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464

【讨论】:

【参考方案5】:

这个问题可能是由于 gdb 的 python 问题。我推荐使用 msys2 + mingw。它工作正常,你得到了 gcc 的最新版本。 如何使用 msys2 安装 mingw:

安装 msys2 pacman -Suy pacman -S mingw-w64-x86_64-gcc pacman -S mingw-w64-x86_64-gdb pacman -S mingw-w64-x86_64-make 将“D:\msys64\mingw64\bin”添加到路径 ENV

【讨论】:

以上是关于在 VS 代码中使用 gcc 无法看到 std::vector 的元素的主要内容,如果未能解决你的问题,请参考以下文章

使用gcc -std = c ++ 11时,为什么Cygwin中的某些系统函数未定义?

C++:在 mac osx 上使用 std::cout 和 gcc

a,b = b,在C ++中的python vs std :: swap()中

gd 7.2.0无法识别std :: expf和std :: logf

在 VC++ 11 中使用别名声明

vs怎么使用是gcc代码怎么写?