CLion 的 Debug 模式是怎么回事
我思考这个问题的起因是 Codeoforces Avito Challenges 2018 的 E 题,我想到了正解,但写得太慢,最后一刻才提交。有个地方写错,结果是 Runtime error on pretest 13。
那个错误是个数组越界。代码片段如下:
#define rng(i, a, b) for(int i = (a); i < (b); ++i)
vv<pii> fact(2e5+5);
// 计算 fact
vv<bool> dp(m, vb(ma)); // m 和 ma 是正整数
vv<int> pre(m, vi(ma));
rng (i, 0, SZ(fact[a[0]])) {
dp[0][i] = true;
}
rng(i, 0, m) { // 错误出在这里
auto &cur = fact[a[i]];
auto &nxt = fact[a[i + 1]];
rng(j, 0, SZ(fact[a[i]])) {
if(dp[i][j]) {
int t = cur[j].second;
for (int k = 0; k < SZ(nxt); k++) {
if(t < nxt[k].first) {
dp[i+1][k] = true;
pre[i+1][k] = j;
}
}
}
}
}
那个 for 循环本应是 rng(i, 0, m-1)。我的写法通过了三个样例,交上去在 pretest 13 RE 了。仓促改了另外一个地方又交上去结果在 pretest 2 就 RE 了。数组越界这个问题什么时候会触发 RE 是不确定的。
赛后我想起曾经看到过 std::vector 会自动检查数组越界,可是我在 CLion 中编译运行上面的代码为何运行时没提示数组越界呢,况且 CLion 的 Run/Debug Configurations 还显示处于 Debug 模式。

图-1
图中红线框出的那里,左边的 algo 是当前选择的 target 的名字,target 是在 CMakeLists.txt 中定义的。红框圈起来的东西,官方名称 是 run/debug configuration selector。

图-2
于是我搜了一下怎样开启数组越界检查。在 StackOverflow 上找到一个答案。办法就是编译时加上选项 _GLIBCXX_DEBUG 其实这是个宏定义,不必作为 g++ 的命令行选项, 在代码里加上 #define _GLIBCXX_DEBUG 也可以,和其他宏定义没区别,只不过会被编译器识别,并对编译器产生影响。
我加了这个宏定义再编译运行原来的代码,果然就报错了。不过并没有指明错误是由哪一行代码引起的,对于 debug 帮助不大,这个问题请移步这里。不过虽然未能指出是那一行代码出的错,但是指出了是访问 3 这个位置越界了,那么就说明对应的 vector 的 size 应该是 3,这个信息对于这道题目的 debug 仍然很有帮助,据此可以知道这个 3 是 m 的值。

图-3
我的疑问是 CLion 的 Build/Debug Configurations 框里的那个 Debug 到底是什么含义(What does it imply?)先看看这个 Debug 究竟是什么含义。
首先要介绍 CLion 中的一个重要概念 Run/Debug Configrations。
To run or debug your code in CLion, you can use numerous run/debug configurations. Each run/debug configuration represents a named set of run/debug startup properties. When you perform run, debug, or test operations with CLion, you always start a process based on one of the existing configurations using its parameters.
CLion comes with a number of run/debug configuration types for the various running, debugging and testing issues. You can create your own run/debug configurations of specific types.
关于 Run/Debug Configurations 的更多细节,见 Create and Edit Configurations。
其实 图-1 红框里的那个 Debug 是当前所选择的 configuration 所采用的 CMake profile 的名字。可以在下图中的加号(+)上面看到 “profiles” 字样。
**图**-4
上图是 CMake settings dialog。
当然这个 name 是可以改的,比如改成 debug,那么第一幅图红框里也会相应地由 Debug 变成 debug。
现在我们收集到的信息有
- 图-1 中的 Debug 字样代表的是当前的 configuration 所采用的 CMake profile。
- 这个 CMake profile 名为 "Debug" 是因为所选的 build type 是 Debug。
- CMake profile 中的 build options 是传给 build tool 的。在我采用的 toolchain 里,build tool 是 make。
现在我们要问:当 build type 为 Debug 时,是否会把类似于 _GLIBCXX_DEBUG 这样的选项传递给编译器呢?
答案是不会。
我们可以从 CLion 文档中关于 build type 的页面上示例代码中推测出来

图-5
关于 图-4 中的 build option -j 6,CLion 文档是这样解释的:
Build options In this text field, specify the options to be passed to the build tool used by CMake.
Find more information about the available build options in the CMake documentation.
If nothing is specified, the default settings are used. Note, that default settings depend on the selected environment. For example, if make generator is selected, the default value is -j <number_of_cpu>, while for Microsoft Visual C++ the field is empty.
我采用的 toolchain 是 MinGW,所用的 generator 自然是 make,另外我的 laptop 的 CPU 是 Intel Core i7-8750H,# of Cores = 6,因此默认的 build option 是 -j 6。
在 CMake 文档里关于 CMAKE_BUILD_TYPE 这个 variable 的说明页面,我找到线索
... For example, in a build tree configured to build type
Debug, CMake will see to havingCMAKE_C_FLAGS_DEBUGsettings get added to theCMAKE_C_FLAGSsettings.
我猜当 build type 是 Debug 时 CMake 只是把 -g 之类的调试选项传给编译器了。
结论
Run/Debug Configurations 是控制可执行文件生成以后的执行与调试的,而 Build Configurations 是控制从源代码生成可执行文件的过程的。
Reference
Catching silly mistakes with GCC
C++ и bounds checking
CLion 的 Debug 模式是怎么回事的更多相关文章
- C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call问题。
今天遇到一个Access Violation的crash,只看crash call stack没有找到更多的线索,于是在debug模式下又跑了一遍,遇到了如下的一个debug的错误提示框: 这个是什么 ...
- Intellij IDEA debug模式下项目启动慢/无法启动的事件解决过程记录
项目无法启动了 简单的介绍一下事件过程:周一的早上,收到前端同事抛过来的一个任务,说是一个接口无法正常返回数据,于是就让他把参数发过来,我想试着在本地重现一下并且将问题修复掉,这种情况肯定是要通过de ...
- MySQL 编译安装并且开启DEBUG模式
因为想分析下mysql中一些操作的内部执行过程,单纯的看源码太枯燥了,所以决定结合mysql的执行过程来分析,mysql作为一款成熟的数据库软件,在设计的时候就考虑到了调试的问题,只是想开启调试模式的 ...
- tomcat的debug模式启动不了
这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动tomcat时,发生了读取文件错误,eclipse自动设置了断点,导致tomcat不能正常启动.解决方法如下,打开b ...
- Debug模式下编译溢出问题
问题: 代码在Debug模式下编译报出内存溢出的错误,而Release模式下则没有. 由于Debug模式下包含调试信息,并且不作任何优化.而Release模式进行了各种优化,内存检测等操作均省去,使得 ...
- Debug模式,不能进入打断点的类,反而进入代理类里
有史以来,第一次,遇到这个问题, 设置好断点,Debug模式开启项目,,没有进入原来打好的断点类,反而,进入的是和断点类相同名字(但是图标不同)的一个类里, 不能真正的调试,调试变得很麻烦, 解决方案 ...
- Android studio debug模式获取变量的值
打断点.debug模式运行,Console界面旁边的Debugger界面,或者在变量上右键add to watches
- IDEA 13 无法进入debug 模式解决方案
1.最近在idea中使用tomcat开发项目,像往常一样打开tomcat进行debug,但奇怪的事情出现了,项目根本不进断点.后查找原因,估计idea的加载参数方式是:先加载tomcat中设置的参数, ...
- 以Debug模式启动JBoss
JBoss服务器的启动方法: 假设JBoss的安装目录为$JBOSS_HOME,Windows以及Linux环境下的Debug模式的启动方法分别为:Windows环境:找到Windows下的JBoss ...
随机推荐
- ref是什么?
ref是组件的特殊属性,组件被渲染后,指向组件的一个引用.可以通过组件的ref属性,来获取真实的组件. 因为,组件并不是真正的DOM节点,而是存在于内存中的一种数据结构,称为虚拟的DOM,只有当它真正 ...
- .NET向WebService传值为decimal、double、int、DateTime等非string类型属性时,服务器端接收不到数据的问题
最近在做CRM项目时,使用C#调用SAP PI发布的WebService服务时遇到的问题: 向WebService传值为decimal.double.int.DateTime等非string类型数据时 ...
- django+xadmin在线教育平台(九)
django admin介绍 上一章我们进行了需求分析和数据库设计.本章我们来快速搭建一个可用的后台管理系统. 后台管理系统特点: 权限管理 少前端样式.(样式一般不是很看重), 快速开发 djang ...
- thinkphp 跳转外网代码(php通用)
thinkphp 提供了一个重定向但是在跳转外部网站的时候就会比较麻烦 下面一种方法还不错, < ?php //重定向浏览器 header("Location: http://www. ...
- ECSHOP快递物流单号查询插件
本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅急送快递.德邦物流.百世快递.汇通快递.中通快递.天天快递等知 ...
- 怎样通过互联网ssh访问家里电脑
需求:用可以上网的公司windows电脑连接家里的manjaro linux电脑.. 环境情况:公司电脑为内网,通过登录出口服务器连接互联网.家里的电脑也为内网,通过连接无线路由器连接外网.路由器有公 ...
- 笨小熊 南阳acm62
笨小熊 时间限制:2000 ms | 内存限制:65535 KB 难度:2 描述 笨小熊的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项 ...
- 2016 ACM-ICPC Asia China-Final D 二分
题意:一共有N个冰淇淋球,做一个冰淇淋需要K个球,并且由于稳定性,这K个球还必须满足上下相邻的下面比上面大至少两倍.先给出N个球的质量,问最多能做出多少个冰淇淋? 思路:二分答案并对其检验. 检验标准 ...
- POJ:2976-Dropping tests(二分平均值)
Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15508 Accepted: 5418 Descr ...
- 机器学习笔记(一)—— 线性回归问题与Matlab求解
给你多组数据集,例如给你很多房子的面积.房子距离市中心的距离.房子的价格,然后再给你一组面积. 距离,让你预测房价.这类问题称为回归问题. 回归问题(Regression) 是给定多个自变量.一个因变 ...