我对这个问题产生兴趣的起因是 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);// 计算 factvv<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 option 应当是传给编译器的。

现在我们要问:当 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 having CMAKE_C_FLAGS_DEBUG settings get added to the CMAKE_C_FLAGS settings.

我猜当 build type 是 Debug 时 CMake 只是把 -g 之类的调试选项传给编译器了。

结论

Run/Debug Configurations 是控制可执行文件生成以后的执行与调试的,而 Build Configurations 是控制从源代码生成可执行文件的过程的。我应该去修改 Build Configrations 也就是 CMake profile,比如可以把 -D_GLIBCXX_DEBUG 添加到 Build option。在代码中加上 #define _GLIBCXX_DEBUG 也是可行的。

Reference

Catching silly mistakes with GCC
C++ и bounds checking

转载于:https://www.cnblogs.com/Patt/p/10136138.html

CLion 的 Debug 模式是怎么回事相关推荐

  1. CLion的debug模式程序正常运行,run模式下出现停止运行

    问题复现 然后使用debug模式运行 一般出现这种情况,就不是代码的问题了,那么就是软件的问题 解决办法 那就是找到编译好的exe文件,然后设置该文件以兼容模式运行. 然后在点击运行就可以执行成功了 ...

  2. Intellij IDEA debug模式下项目启动慢/无法启动的事件解决过程记录

    项目无法启动了 简单的介绍一下事件过程:周一的早上,收到前端同事抛过来的一个任务,说是一个接口无法正常返回数据,于是就让他把参数发过来,我想试着在本地重现一下并且将问题修复掉,这种情况肯定是要通过de ...

  3. 使用CLion+WSL debug nginx源码

    1. 环境准备 支持WSL的Windows系统,只要支持WSL,windows10和windows11均可! 基于WSL Ubuntu20.4,具体怎么在WSL中安装Ubuntu请自行查找资料! 需要 ...

  4. Debug模式下加载文件,运行程序异常的慢

    今天在进行单元测试的时候,debug模式下加载速度很慢,但是run模式下速度很快. 原因:在debug模式下,断点位置不当,解决办法 移除编译器中的所有断点. 转载于:https://www.cnbl ...

  5. Linux下Debug模式启动Tomcat进行远程调试

    J2EE开发各类资源下载清单,  史上最全IT资源,点击进入! 一.      应用场景 在实际的测试过程中,可能会遇到由于程序执行的不间断性,我们无法构造测试场景来验证某个功能的正确性,只有通过代码 ...

  6. 分享一个android debug模式,出现 waiting for debugger把界面卡住,取巧的解决办法

    使用android studio开发程序时,有时会出现 waiting for debugger 卡住界面,软件无法正常debug运行的情况,很多网友分享了一些解决办法,比如: 1 打开cmd进入命令 ...

  7. Eclipse 中 Debug 模式跳转到 exitCurrentThread 的问题解决

    Eclipse 中 Debug 模式跳转到 exitCurrentThread 的问题解决 参考文章: (1)Eclipse 中 Debug 模式跳转到 exitCurrentThread 的问题解决 ...

  8. laravel-admin 关闭debug模式导致异常信息到页面的排查

    laravel-admin 关闭debug模式导致异常信息到页面的排查 参考文章: (1)laravel-admin 关闭debug模式导致异常信息到页面的排查 (2)https://www.cnbl ...

  9. Intellij Idea debug 模式如果发现异常,即添加异常断点在发生异常处

    Intellij Idea debug 模式如果发现异常,即添加异常断点在发生异常处 参考文章: (1)Intellij Idea debug 模式如果发现异常,即添加异常断点在发生异常处 (2)ht ...

最新文章

  1. Python3 基础语法(笔记1)
  2. Atom飞行手册翻译: 2.12 在Atom中写作
  3. http服务器响应格式,熟悉Http协议的请求和响应格式,编写一个简单的Http服务器。 基本要求:1 正确解...
  4. java lucene cms_JEECMSv6标签使用之[@cms_lucene_list]
  5. 项目升级-加密的参数传递到后台然后解密(相当于重新封装下request)
  6. 经典排序算法-MFC实现之3:冒泡排序
  7. openlayers5学习笔记-001
  8. colormap保存 matlab_matlab中自定义colormap的保存与调用
  9. java中字符类型的转换
  10. gflags使用详解
  11. 整理一下第一次参加华为大数据挑战赛自己的一些收获吧(正式赛篇阶段一)
  12. 计算机办公模式是什么,华为Mate 10“电脑模式”告诉你什么是真正的“移动办公”...
  13. Mono.Cecil 初探(一):实现AOP
  14. 历史为什么丑化隋朝_历史上被严重丑化的五大名人,明明该流传千古,却变成遗臭万年!...
  15. Python学习笔记(字符串、列表、字典)
  16. 【Android取证篇】华为手机OTG备份密码重置教程
  17. Vue2写浙江政务服务平台微服务踩的坑
  18. JAVA数组扁平化整合_一文搞定数组扁平化(超全面的数组拉平方案及实现)
  19. 报表练习题:销售订单打印的相关说明
  20. w ndows热键,Windows8 鼠标键盘快捷键热键技巧汇总

热门文章

  1. Vue项目的登录和注册界面
  2. 收集一些支付平台(第四方)
  3. SystemVerilog学习笔记1 ---《数据类型》
  4. win10pro不够pro,win10专业工作站版本才是真的牛
  5. 企鹅公司为企业与单位推出的一款基于其业务交流平台,该款企业微信mac版可以很轻松的进行企业级沟通
  6. Easy EDA #学习笔记08# | 创建元件库(原理图库与PCB封装库)
  7. NPDP知识推送-第七章产品生周期管理(2)
  8. 【烈日炎炎战后端】MySQL理论(2.8万字)
  9. 如何实现web系统检测浏览器类型的功能
  10. yolov3网络(DarkNet53)结构详解以及Pytorch代码实现