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

📅 2026/8/24 12:28:35
[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; vectorvectorstring strArray; int count0; // bool secondNodeFoun true; bool firstNoneFound true; bool lastNoneFound true; string element2 0; vectorstring Before_lineArray; while (getline(inFile,lineStr)) { count; if(count5) { // coutlineStrendl; stringstream ss(lineStr); string str; vectorstring lineArray; int byRow 0; // if(secondNodeFoun! true) // { // } while(getline(ss,str,,)) { byRow ; if(byRow 2 str ! element2 firstNoneFoundtrue) { coutlineArray.at(0)endl; firstNoneFound false; } lineArray.push_back(str); } if(count6) { 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 firstNoneFoundfalselastNoneFoundtrue) { coutBefore_lineArray.at(0)endl; lastNoneFoundfalse;//保证只输出一次的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次断点命中第N1次才触发- 示例- 输入 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 i100 ; ignore 1 99 # 50行断点i100且忽略前99次触发2. 编辑已有断点的属性对应edit breakpoint propertiesgdbinfo breakpoints # 查看所有断点获取目标断点编号如num1condition 1 i100 # 给编号1的断点设置条件i100ignore 1 99 # 给编号1的断点设置忽略次数99次3. 清除条件/忽略次数gdbcondition 1 # 清除编号1断点的所有条件ignore 1 0 # 清除忽略次数设为0即不忽略[C]慎用一键替换NULL直接替换nullptr容易把原有的nullptr换成nullptrptrNULL;换成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 参数 暂时删除。- 找到所有形如 -DXXXXXXXX 的部分全部删除。- 例如删除 -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 typevirtual顶层有 没有实现的函数。[Q5]not pluginQT 5.12.7 里面的 Mingw73_64里面的plugins放在bin同级目录再把bin里面的Items.拷贝到大系统的bin里面。[Q6]rc.exe无法运行rc.exe核心是找不到、路径错、SDK/VS组件缺失、权限/拦截。以下是Windows下尤其QtMSVC的快速修复步骤按优先级执行1.快速定位rc.exe- 常见路径C:\Program Files (x86)\Windows Kits\10\bin\10.0.xxxx.0\x86/x64C:\Program Files (x86)\Microsoft Visual Studio\20xx\Community\bin1. 用VS开发者命令提示符优先打开“x86/x64 Native Tools Command Prompt for VS 20xx”自动配环境变量再编译或启动Qt Creator2. 检查并安装Windows SDKVS Installer→修改→勾选对应Windows SDK版本查看项目属性→配置属性→常规→Windows SDK版本确保本地已装3. 临时配置环境变量命令行bash# 示例替换为你的路径set PATHC:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64;%PATH%set INCLUDEC:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um;%INCLUDE%【编译器选错了Select MinGW64】[Q7]Qmap报错解决添加MyData() defaultQmap报错解决添加MyData() default;这种使用成员初始化列表的构造函数写法是 C 的标准用法完全适配 QMapint, 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 对象 QMapint, 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 problemQT需要安装在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 工具自动拷贝依赖库命令行执行bashwindeployqt.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. 首单元格按CtrlF9插入花括号输入 SEQ 表编号 \* ARABIC 2. 按F9更新显示为13. 复制到其他行按F9统一更新4. 加前缀可写 表-{ SEQ 表编号 \* ARABIC } 。Excel休息CONCATENATE(MID(A5,1,LEN(A5)-1),-1)将字符串最后一个换位-1如果这篇文章对你有帮助别忘了点个关注我会持续分享更多开发避坑与实战干货下次更新你就能第一时间看到啦