[C++]从条件断点到GDB命令行:一条条件调试指令的跳转之路

读写XML文件
【Qt QDomComment读写Xml文件(含示例源码) - CSDN App】http://t.csdnimg.cn/huoCn
【QT实现XML文件的写入和读取 - CSDN App】http://t.csdnimg.cn/dpny8
读写CSV文件
#include "基本的一些头文件"
ifstream inFile("data.csv",ios::in);
string lineStr;
vector<vector<string>> strArray;
int count=0;
// bool secondNodeFoun =true;
bool firstNoneFound= true;
bool lastNoneFound= true;
string element2 = "0";
vector<string> Before_lineArray;
while (getline(inFile,lineStr))
{
count++;
if(count>5)
{
// cout<<lineStr<<endl;
stringstream ss(lineStr);
string str;
vector<string> lineArray;
int byRow = 0;
// if(secondNodeFoun!= true)
// {
// }
while(getline(ss,str,','))
{
byRow ++;
if(byRow ==2 && str != element2 && firstNoneFound==true)
{
cout<<lineArray.at(0)<<endl;
firstNoneFound= false;
}
lineArray.push_back(str);
}
if(count==6)
{
Before_lineArray.push_back(lineArray.at(0));
Before_lineArray.push_back(lineArray.at(1));
Before_lineArray.push_back(lineArray.at(2));
}
if(lineArray.at(1) == element2 &&firstNoneFound==false&&lastNoneFound==true)
{
cout<<Before_lineArray.at(0)<<endl;
lastNoneFound=false;//保证只输出一次的bool
}else
{
Before_lineArray.clear();
Before_lineArray.push_back(lineArray.at(0));
Before_lineArray.push_back(lineArray.at(1));
Before_lineArray.push_back(lineArray.at(2));
// Before_lineArray.at(0)=lineArray.at(0);
// Before_lineArray.at(1)=lineArray.at(1);
// Before_lineArray.
}
// secondNodeFoun= false;
strArray.push_back(lineArray);
}
}
getchar();
return 0;
安装新组件
在Qt安装后,如果需要添加或更新组件,可以使用Qt Maintenance Tool进行管理。以下是具体的步骤:
首先,在Qt的安装路径下找到MaintenanceTool.exe,双击打开它。如果使用的是Qt 5.10版本,打开后界面如下图所示。
直接选择“Skip”,进入下一步。然后依次按照界面上的提示步骤进行操作。
在弹出的界面中选择“存储库”选项卡,选择“临时存储库”,点击“添加”,然后输入https://download.qt.io/online/qtsdkrepository/windows_x86/root/qt/,点击“测试”。测试成功后,点击“OK”。
此时再次回到第一个页面,点击“Skip”,选择“添加或移除组件”,系统会提示正在准备下载,等待完成后就可以添加或移除组件了。
按照这些步骤,就可以通过Qt Maintenance Tool来添加或更新Qt安装的组件了。这种方法简单方便,适用于需要自定义Qt安装组件的用户。
断点调试
调试不跳入语句:
常量赋值语句;条件语句;qdebug语句
跳入:
return 语句;指针分配内存/赋值语句
条件调试
在调试器中设置 edit breakpoint properties (编辑断点属性)的Condition(条件)和Ignore count(忽略次数),核心是让断点满足指定条件/跳过指定次数后才触发,不同调试器(GDB/VS/Qt Creator/CLion)操作逻辑一致,仅界面/命令行写法不同,以下分图形化调试器(通用)和GDB命令行两类说明,覆盖开发中最常用场景。
图形化调试器(Qt Creator/VS/CLion/VS Code)
以Qt Creator为核心,其他工具操作完全同源,步骤如下:
1. 打开断点属性窗口
- 方式1:在代码行断点处右键 → 选择Edit Breakpoint/编辑断点属性;
- 方式2:打开调试面板的Breakpoints列表,双击目标断点,或右键选择Properties。
2. 设置Condition(条件)
- 输入框标注: Condition / 条件表达式 / Break when ;
- 要求:输入可执行的布尔表达式(调试器会在断点处计算,结果为 true 时触发断点);
- 示例:
- 变量判定: i == 100 (变量i等于100时触发)、 str != nullptr (指针非空时触发);
- 表达式判定: arr[0] > 50 (数组第一个元素大于50时触发)、 func() == true (函数返回真时触发);
- 关键:表达式需符合当前编程语言语法(C++/C/Java等),变量必须是断点处可见的作用域变量(局部/全局)。
3. 设置Ignore count(忽略次数)
- 输入框标注: Ignore count / 忽略次数 / Skip ;
- 要求:输入非负整数(调试器会跳过前N次断点命中,第N+1次才触发);
- 示例:
- 输入 0 :不忽略,每次命中都触发(默认值);
- 输入 99 :前99次执行到断点处直接跳过,第100次触发;
- 适用场景:循环中无需逐次调试,直接定位到指定循环次数。
4. 生效:点击OK/应用,调试时自动按规则触发断点。
GDB命令行(Linux/嵌入式调试,无图形化界面)
GDB中通过 break 创建断点,或 edit breakpoints / b + condition / ignore 命令修改属性,核心命令如下(断点编号可通过 info breakpoints 查看,默认第一个断点编号为 1 ):
1. 创建断点时直接设置条件+忽略次数
gdb
# 格式:break 行号/函数名 if 条件 ; ignore 断点编号 忽略次数
break main.cpp:50 if i==100 ; ignore 1 99 # 50行断点,i=100且忽略前99次触发
2. 编辑已有断点的属性(对应edit breakpoint properties)
gdb
info breakpoints # 查看所有断点,获取目标断点编号(如num=1)
condition 1 i==100 # 给编号1的断点设置条件:i==100
ignore 1 99 # 给编号1的断点设置忽略次数:99次
3. 清除条件/忽略次数
gdb
condition 1 # 清除编号1断点的所有条件
ignore 1 0 # 清除忽略次数(设为0即不忽略)
[C++]慎用一键替换
NULL直接替换nullptr
容易把原有的nullptr换成nullptrptr
NULL;换成nullptr;
NULL 换成nullptr ,接下来将记录一些QT常见的错误。
[Q1]fatal error: no input files
在 Qt 5.12.7 编译时遇到 -1: error: fatal error: no input files 报错,通常不是指真的没有源文件,而是 .pro 或 .pri 工程文件的语法出现了小问题。
最常见的原因是:工程文件中出现了连续的两个反斜杠 \\ 。
[Q2]macro names must be identifiers
比较正确与错误的编译命令行。终端编译命令多了 -较正确与错误的编译命令行。终端编译命令多了 -DDEFINES -D+=,导致编译错误。
下面的DEFINES +=QT_NO_QDEBUG被识别为三个宏了。
-D+=,导致编译错误。
下面的DEFINES +=QT_NO_QDEBUG被识别为三个宏了。由于DEFINES += 前面一行没有接空行,自然就跟着/后,被识别为宏了。
[S2]macro names must be identifiers
第一步找到环境变量 open Terminal按钮
cd .pro所在路径第二步:复制编译命令
1. 在 Qt Creator 的 编译输出 (Compile Output) 面板中,找到报错那一行对应的完整 g++ 命令。
- 它通常以 g++ -c -fno-keep-inline-dlexport -O2 ... 开头。
2. 完整复制这一行命令(从 g++ 开始,到最后一个 .cpp 文件结束)。第三步:在终端执行与调试
1. 将复制的命令粘贴到刚才准备好的 CMD 终端中,先不要回车。
2. 简化命令(核心步骤):
为了快速定位问题,我们需要把命令行中所有的宏定义(-D 参数) 暂时删除。
- 找到所有形如 -DXXXX=XXXX 的部分,全部删除。
- 例如,删除 -D_UNICODE -DQT_CORE_LIB ... 这一整段。
3. 执行简化后的命令:
按下回车。此时应该能编译通过(如果不通过,说明是代码本身或路径问题,与宏无关)。
4. 二分法恢复宏定义:
- 将刚才删除的 -D 参数分成两部分。
- 先把第一部分粘贴回命令行,执行。
- 如果报错:问题在这一部分,继续拆分。
- 如果不报错:问题在另一部分,换另一部分测试。
- 重复此过程,直到找到单独哪一个 -D 参数导致了 macro names must be identifiers 错误。
[Q3]No rule to make target needed by 'debug/main.o
项目里的绝对路径没取消
pro文件里面的TARGET路径设置找不到。
[Q4]invaild new-expression of abstract class type
virtual顶层有 没有实现的函数。
[Q5]not plugin
QT 5.12.7 里面的 Mingw73_64里面的plugins放在bin同级目录
再把bin里面的Items.拷贝到大系统的bin里面。
[Q6]rc.exe
无法运行rc.exe,核心是找不到、路径错、SDK/VS组件缺失、权限/拦截。以下是Windows下(尤其Qt+MSVC)的快速修复步骤,按优先级执行:
1.快速定位rc.exe
- 常见路径:C:\Program Files (x86)\Windows Kits\10\bin\10.0.xxxx.0\x86/x64;C:\Program Files (x86)\Microsoft Visual Studio\20xx\Community\bin
1. 用VS开发者命令提示符(优先):打开“x86/x64 Native Tools Command Prompt for VS 20xx”,自动配环境变量,再编译或启动Qt Creator
2. 检查并安装Windows SDK:VS Installer→修改→勾选对应Windows SDK版本;查看项目属性→配置属性→常规→Windows SDK版本,确保本地已装
3. 临时配置环境变量(命令行):
bash
# 示例(替换为你的路径)
set PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64;%PATH%
set INCLUDE=C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um;%INCLUDE%【编译器选错了,Select MinGW64】
[Q7]Qmap报错解决:添加MyData() = default;
Qmap报错解决:添加MyData() = default;
这种使用成员初始化列表的构造函数写法是 C++ 的标准用法,完全适配 QMap<int, YourClass> 的创建需求,只需保证类提供默认构造函数(或显式禁用后仅用带参构造插入元素)。
完整可运行代码示例#include <QMap> #include <QString> #include <QDebug> class MyData { public: // 成员变量 QString A; QString B; // 1. 带参构造函数(成员初始化列表方式) MyData(const QString& a, const QString& b) : A(a), B(b) {} // 2. 必须显式声明默认构造函数(否则 QMap 用 [] 时会报错) MyData() = default; }; int main() { // 直接创建 QMap 对象 QMap<int, MyData> dataMap; // 方式1:用 insert 插入带参构造的对象 dataMap.insert(1, MyData("key1_valA", "key1_valB")); dataMap.insert(2, MyData("key2_valA", "key2_valB")); // 方式2:用 [] 赋值(依赖默认构造函数) dataMap[3] = MyData("key3_valA", "key3_valB"); // 遍历输出 for (auto it = dataMap.begin(); it != dataMap.end(); ++it) { qDebug() << "Key:" << it.key() << " A:" << it.value().A << " B:" << it.value().B; } return 0; }
1. 默认构造函数的必要性
- 若使用 map[key] = value 语法,必须提供默认构造函数( = default 或手动写空实现)。
- 若只使用 insert 插入元素,可以禁用默认构造函数( MyData() = delete; ),避免无意义的空对象创建。
[Q8]QT安装错误
windows环境下报错:this application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem
QT需要安装在C盘(安到其他盘,需配置环境变量,较为麻烦)
1.QT都是用的同一个安装包
2.选的满配
3.安装系统盘/其他磁盘的区别(这个就是问题所在)
这个错误的核心原因是Windows 无法找到 Qt 平台插件(如 qwindows.dll ),或插件依赖的库缺失。以下是可直接执行的解决步骤:
1. 确认插件路径并配置环境变量
找到 Qt 安装目录下的 plugins/platforms 文件夹(例如 D:\Qt\5.15.2\msvc2019_64\plugins\platforms ),将其路径添加到系统环境变量 QT_QPA_PLATFORM_PLUGIN_PATH 中。
2. 复制插件到程序运行目录
将 platforms 文件夹完整复制到你的 Qt 程序可执行文件( .exe )所在的同级目录下,确保目录结构为 程序目录\platforms\qwindows.dll 。
3. 补齐依赖的运行库
- 使用 Qt 自带的 windeployqt.exe 工具自动拷贝依赖库,命令行执行:
bash
windeployqt.exe 你的程序路径\你的程序.exe
- 若仍缺失库,可使用 Dependency Walker 工具打开 .exe ,排查并补充缺失的 Qt5Core.dll 、 Qt5Gui.dll 等文件。
4. 检查编译器架构匹配
确保编译程序的 Qt 版本架构(32位/64位)与 Windows 系统架构一致,且编译时使用的编译器(如 MSVC、MinGW)与运行库匹配。
[Q9]系统设置导致报错
[win设置环境变量]
关于
设置高级系统配置
设置环境变量路径:
./osgLibrary/lib
./osgLibrary/bin
[QT设置环境变量]
QT内部环境变量设置+项目+构建环境
[统一编译时间]本地时间设置不对,与qt自动获取的
Office休息时间
Word图/表/序号域代码
🧩 方法三:SEQ域(跨表统一编号,可加前缀)
1. 首单元格按Ctrl+F9插入花括号,输入: SEQ 表编号 \* ARABIC ;
2. 按F9更新显示为1;
3. 复制到其他行,按F9统一更新;
4. 加前缀可写: 表-{ SEQ 表编号 \* ARABIC } 。
Excel休息
=CONCATENATE(MID(A5,1,LEN(A5)-1),"-1")
将字符串最后一个换位-1
如果这篇文章对你有帮助,别忘了点个关注,我会持续分享更多开发避坑与实战干货,下次更新你就能第一时间看到啦~
更多推荐

所有评论(0)