解决办法有两种:
遇到标准库函数的语句,用单步跳过(逐过程),而不是单步执行,已经进入库函数了就单步跳出;
改编译器配置,一劳永逸的解决问题
VS:改 default.natstepfilter 文件:
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Packages\Debugger\Visualizers\default.natstepfilter以管理员身份打开,并在 xml 格式中加入一行:
<Function><Name>std::.*</Name><Action>NoStepInto</Action></Function>VSCode:改每个项目的 Lunch.json 文件,在 "setupCommands" 里加上:
{ "description": "防止gdb打开标准库函数", "text": "-interpreter-exec console \"skip -rfu std::.*\"", "ignoreFailures": false }参见:避免vscode调试C++时进入标准库 | VScode调试C++不进入标准库的配置方法:https://zhuanlan.zhihu.com/p/576544599
出现这个问题的原因有很多,可能是你确实没有这个文件,可能是没放在环境变量或者默认包含路径里,可能是头文件写的包含路径不对;
还有一个可能的原因是因为没开管理员权限,我用 Arduino、Qt Creater、Keil 的时候都遇到过这种问题;可以右击软件图表,选择【属性】,在【兼容性】选项卡中,勾选【以管理员身份运行此程序】;设置成功之后,软件图标右下角应该会显示一个盾牌,之后每次打开直接就有管理员权限。
如果是 Qt 5.15 以前的版本,可以下载离线安装包:
针对 Qt 安装器下载慢:去镜像网站下载:http://mirrors.ustc.edu.cn/qtproject/official_releases/online_installers/
针对 Qt 库在线安装时下载慢:切换到镜像源:网上有些文章说用 flddler 改 HTTP 代理地址,完全是多此一举,根本要不了那么麻烦。新版本的安装器(4.0.1-1 后)本身就提供了切换镜像的功能。在命令行中执行安装器,添加
--mirror https://mirrors.ustc.edu.cn/qtproject
参数。例如 Windows 下执行当前目录的安装器的命令为:./qt-unified-windows-x86-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject你可以先在 Qt 安装器的目录,打开 cmd,输入
./<Qt安装器文件名>
,如果能打开 Qt 安装,则在后面再加上--mirror https://mirrors.ustc.edu.cn/qtproject
,进行安装。
- “dll” 是Dynamic Link Library(动态链接库)的缩写,静态库在编译链接的时候就要引入,而动态库在程序执行的时候才引入,常用于存储可由多个程序共享的函数或数据;
- 打开程序报错缺少的 “xxx.dll” 文件一般是系统自带或者常用程序的动态链接库,可以去 dll 网站(比如:找dll)下载缺失的 .dll 文件,放到
C:\Windows\SysWOW64
或C:\Windows\System32
目录下面。- 有些 DLL 文件看名字就能猜出它是啥,比如
Qt5Help.dll
,肯定是 Qt 里的,咱们需要把<Qt安装目录>\mingw\bin
添加到系统环境变量。
- 这是编码格式的问题,可能别人的程序是 GBK 而我们的是 UTF-8,可以参考:Matlab不同版本之间的乱码问题:https://zhuanlan.zhihu.com/p/590985353
- 新建一个 startup.m 文件,放到你安装位置,然后在 .m 文件里面 set() 有中文的字体。
- 可以参考:matlab编程或者画图时输出汉字为□□?:https://zhuanlan.zhihu.com/p/678752167
- 大部分编译器都可以显示调用堆栈,可以让我们直接看到执行哪一行代码出了问题;
- 最常见的异常是访问没初始化的变量和字段、访问已经释放的指针;
- Eigen 是 C++ 的一个开源线性代数库,主要是进行矩阵运算,对导航算法相当关键,要知道导航算法基本都是矩阵计算。除了基本的矩阵计算之外,支持四元数、旋转矩阵,C++ 写的导航定位的开源代码中基本都会用到 Eigen。
- 使用 Eigen 有个麻烦的地方就在于难以调试,经常报错了,你找不到问题在哪,尤其是一口气写了一大段。有的错误写出来的时候编译器就会提示你错了,有的编译的时候就报错并且告诉你哪一行出错了,这两种都还比较友好;麻烦的是的是有的编译的时候报错不告诉你哪一行错,有的编译能过,运行到那一行才出错。
- 我习惯写两行就编译一下,写几句就单步调试一下,要不然写多了不好调试。
- 在监视窗口输入要查看表达式来查看;
- 数组可能还是不方便直接看,得输出到终端或者文件才能看到:
- RTKLIB 及其二次开发程序可以用 tracemat() 函数;
- Eigen 库重载了 ”<<“,可以直接 Cout 输出到数据流;
可能是因为库装到
/usr/local/lib
里了,试试创建软链接到/usr/lib
:ln -s /usr/local/lib/库名.a /usr/lib/库名.a也可以直接把
/usr/local/lib
也添加到包含目录。
可能是设置成了 Relese 模式,改成 Debug 模式才能断点调试。
ROS 程序命令编译的时候
加上参数启用调试:
catkin_make -DCMAKE_BUILD_TYPE=Debug
,如果能进断点但是看不了变量的值,可能是因为有些部分是之前没设置调试编译的,可以把编译生成的文件全删了,再重新编译。在 CMakeLists.txt 中指明编译类型:
if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) endif()
把 lunch.json 文件中的
"type": "cppvsdbg"
改为"type": "cppdbg"
vim ~./bashrc
在末尾加上export DISPLAY=127.0.0.1:0
,或者后面填自己的 IP 地址,保存退出。- 执行命令:
source ~/.bashrc
;- 打开 Xluanch ,前两步默认设置就行,第三步中 Disable access control 一定要选上;
- 执行命令:
startxfce4
,即可启动界面。
- 提示 permission denied 显然是因为要管理员权限,可以在命令前面加上
sudo
;- 提示 command not found 可能是因为文件没有执行权限,可以通过命令来添加:
chmod +x <.sh 脚本名>
;
要配置 VSCode + WSL 的开发环境,需要在 WSL 里也装上 C++、CMake 系列的插件,直接下载方式特别慢。
- 先去网站下载后缀名为 .VXIS 的插件:https://marketplace.visualstudio.com/;
- 把 VXIS 文件放到 WSL 中,VScode 中可以直接把资源管理器中的文件托入左侧文件列表;
- VSCode 中选择通过 VXIS 安装,在下来菜单中选择要安装的 VXIS 文件,稍等片刻即安装成功。
远程控制 ROS 需要从机和主机在同一个局域网下面,也就是连同一个 WiFi 或者热点,或者一个电脑机连一个电脑的热点;
需要改 .bashrc 文件设置多机通信的环境:
在 ROS 主机的 .bashrc 文件最后添加:
export ROS_MASTER_URI=http://(这里填ros主机的IP地址):11311 export ROS_HOSTNAME=(这里填ros主机的IP地址)在 ROS 从机的 .bashrc 文件最后添加:
export ROS_MASTER_URI=http://(这里填ros主机的IP地址):11311 export ROS_HOSTNAME=(这里填ros从机的IP地址) # ifconfig查询
- 如果你缺少连了仿真器,但还是说找不到,可能是因为项目设置中仿真器没选择好,进入【Option for Target】,在【Debug】选项卡的右上角选择对应的仿真器;
- 默认下载程序之后都不会自动运行,按一下单片机上的复位按键手动复位之后,就会执行新烧录的程序;
- 如果你希望程序烧录之后,单片机立刻复位执行,可以进入【Option for Target】,点【Debug】选项卡右上角的【Setting】进入程序下载配置窗口,把【Flash DownLoad】选项卡的【Reset and Run】勾选上。
- 中文注释乱码:打开【Configuration🔧】在【Editor】选项卡中设置【Encoding】为UTF-8;
- 串口输出中文乱码:打开【Option for Target】,在【C/C++】选项卡中将【MiscControls】填写为:
--no-multibyte-chars
。
- Linux 文件路一般是
/usr/bin
,很少出问题;- Window 文件路径一般是
C:\windows\system32
,比较容易出问题,因为\
是 C/C++ 中的转义字符,会将后面的字符转义,不能直接输入,需要把目录中的\
换成/
或者//
;- 在 VS 中的项目配置输入命令行参数时,直接输原本的路径就好,VS 会自动将输入参数的
/
改为//
;- 路径
- 这是因为在 lunch.json 文件中设置了
"stopAtEntry": true
,在程序入口处暂停;
- 当多个线程或进程同时尝试访问相同的数据缓存时,会出现缓存锁竞争的情况。这意味着一个进程正在更新缓存数据,而其他进程正在等待该锁释放,以便它们能够访问或修改缓存。
- 简单来说就是资源被别的程序占用了,实在找不到原因,可以重启系统来解决。
- could not load cache 就是无法加载缓存,可以删除除缓存,重新配置(cmake、make)。
烫烫烫烫烫烫烫烫烫烫烫
:在C/C++编程环境中,当程序试图读取未初始化的字符数组(比如一个本应存放有效字符串但没有正确赋值的数组),而这些内存区域恰好存放了一些看似无意义的值时,可能会出现连续的“烫”字。这通常是因为这些内存区域中存储的数据在以某种文本编码方式(如ASCII或UTF - 8)解读时,被显示成了“烫”这个字符。这可能暗示着这段内容与程序底层的内存数据错误有关,也许是字符串相关的变量没有正确初始化或者已经被破坏。
□□□□□□□□□□□
:这些方块可能代表无法识别或显示的字符。这有几种可能,一是字体不支持某些特殊字符或符号,导致显示为方块占位;二是数据在传输或存储过程中部分丢失或损坏,使得原本的字符无法正确解析,所以用方块来替代显示。也有可能是加密或编码后的内容,没有使用正确的解密或解码方式,导致无法正常显示。
锟斤拷锟斤拷锟斤拷锟斤
:在文本处理中,这是比较典型的UTF - 8编码错误导致的乱码。当数据在不同编码系统之间转换出现问题,或者文本文件本身的编码格式被破坏时,就可能出现这种情况。比如,一个文本文件原本是用GBK编码保存,在以UTF - 8编码方式读取时,如果没有正确的转换机制,就容易出现“锟斤拷”这样的乱码。这表明内容可能经历了错误的编码转换或者文本文件的完整性受到了影响。当ROS终端输出中文时出现乱码
?????
:在main 函数开头加入:setlocale(LC_CTYPE, "zh_CN.utf8");并且引入头文件:
#include <locale.h>
虚拟机与物理机无法进行文本的复制粘贴:可能是 vm-tools 没安装好,用命令安装一下:
sudo apt install open-vm-tools-desktop
然后重新启动系统再试试。
虚拟机无法联网:
- 如果以前装虚拟机都可以正常联网,现在不行了,可以试试还原网络设置:
- 虚拟机设置中网络适配器设成NAT模式;
- 编辑-虚拟网络编辑器中还原默认配置。
- VMware虚拟机网络连接不上怎么办?帮您逐个排查:https://www.abackup.com/enterprise-backup/vmware-internet-not-working-666.html
针对 VM 虚拟机卡顿的一些优化策略:
- 以管理员身份运行VM;
- 安装时将虚拟磁盘存储为单个文件;
- 安装 “Minimal installation” 版的 Ubuntu,其中需要注意的几个点:
- 创建虚拟机的时候选择”暂不安装系统“;
- 虚拟机设置中 CD/DVD 设置为下载的 Ubuntu 安装包路径;
- 打开虚拟机的时候进入 Ubuntu 安装,选择 “Minimal installation”。
- 改 VM 配置:
- 编辑-首选项-内存:预留内存调大;
- 编辑-首选项-优先级:抓取输入内容设为高优先级,勾选调整所有虚拟机内存使其适应预留的主机;
- 虚拟机设置-硬件:内存设置稍微大一些,CPU不要超过物理机个数,硬盘选择 SSCI,把用不着的的光驱和 USB 连接器删了;
- 虚拟机设置-选项-高级:抓取输入内容设为高优先级,禁用内存页面修整,不收集调试信息;
- 虚拟机都是文件形式,最好装在速度快的硬盘里;
- 虚拟机不用的时候不用关机,选暂停,之后启动的更快。
检测系统网络代理和 VSCode 设置的是否一致;
可能网络就是无法连接,去 VSCode 的插件市场下载 .vsix 的插件安装程序:
https://marketplace.visualstudio.com/VSCode
如果经常需要在新环境里配置 VSCode,可以把常用的插件都下载到一个文件夹里,直接一次全安装了。
如果已经安装了对应的功能包,也没有拼写错误,可能是没加载工作空间中的 devel/setup.bash 到环境参数,用
source
命令加载:source devel/setup.bash
重新打开了终端就需要重新进行这一步操作,所以通常把设置工作空间环境参数的 source 指令添加到终端程序初始化的脚本
~/.bashrc
文件中,这样每次打开终端就可以直接用了。
28、ROS 项目 catkin_make 编译的过程中如果报错“The specified base path "XXX" contains a CMakeLists.txt but "catkin_make" must be invoked in the root of workspace"
可以在工作空间根目录执行命令:
unlink ./CMakeLists.txt
- C++ 代码自动补全提示太慢:在设置中把 “Intelli Sense Engine” 设为 “Tag Parser” 模糊提示;原本的提示是智能的,会根据上下文和咱们输入的习惯调整,但是智能提示如果卡的用不了,就只能退而求其次选模糊提示了。
- C++ 程序提示找不到头文件:在
c_cpp_properties.json
文件的includePath
中手动添加头文件引用路径,或者也可以把c_cpp_properties.json
文件删了,再重新打开 VSCode,可以自动生成新的c_cpp_properties.json
。- 设置在底部状态栏显示 CMake 状态、编译工具链信息:在设置中把 CMake 的 “Status Bar Visibility” 设为 “visible"。