OI中C++终端调试技巧

发布时间 2023-07-15 20:14:55作者: DreamerX

零、写在前面

癸卯年七月中,Z老师讲解调试技。愿今年,RP人和,百事聚兴,乃重写终端篇,增其旧志,刻OI巨佬技巧于其上,属予作文以记之

(若无特殊说明,默认在 \(\texttt{Linux}\) 下操作)

壹、终端便利篇

一、目录表示

  1. ./ 本级目录
  2. ../ 上级目录
  3. ./ + 文件名 本级目录下的…… (可结合使用)(e.g. ./Desktop/1.cpp 指桌面下的 1.cpp 文件

二、清空

  1. \(\texttt{Windows}\) 中: cls 只是隐藏命令,reset 才是清空命令
  2. \(\texttt{Linux}\) 中:clear reset printf "\033c" 都行(貌似也可以 Ctrl+L?)

三、复制、粘贴与剪贴

\(\texttt{Windows}\) 中右键即可复制

\(\texttt{Linux}\)Ctrl+C 表结束、终结的意思,复制、粘贴与剪贴应使用 Ctrl+Shift+C/V/X

四、程序不需要手动读入

  1. ./X < ./Y.in 把文件 ./Y.in 输入到 ./X (一般为可执行文件)中
  2. ./X > ./Z.out 把文件 ./X 输出结果输入到 ./Z.out

两者可以结合使用

需要注意的是,一但程序中使用了 freopen,该两条命令将无效(但使用了 fopen 等还是可以用的)

贰、程序调试篇

(在终端中进行)

一、如何调用可执行文件

直接在终端中输入可执行文件名即可

e.g. 输入 ./a 并回车,表示运行 a 可执行文件

二、编译和编译选项

g++ XX.cpp 编译 XX.cpp 文件

但是光是这样编译,只会得到一个 a 的可执行文件(指编译出来的可执行文件命名不随被编译的文件名)

所以,我们需要以下一些命令来使该可执行文件更加方便调试:(直接加在上面那个很简约的命令后面即可)

  1. -o + 编译出来的可执行文件名: 顾名思义,用来命名可执行文件的(这样就不需要手动重命名了)
  2. -O1-O2-O3: 吸氧,优化程序。理论上而言 \(\text{-O3}\)\(\text{-O2}\) 更优,但比赛时默认开 \(\text{-O2}\)\(\text{-O3}\) 更容易出现不可预期的错误,\(\text{-O1}\) 优化不明显?)
  3. -ftrapv:用来查看 int 类型是否溢出

    附用法:编译后运行可执行文件,如果弹出 Abroted 表示有变量溢出,如果不弹出表示啥事没有

  4. -lm:链接数学库(但现在编译器都好像自动链接数学库了,所以加不加无所谓?)
  5. -fsanitize=address:检查数组是否溢出

    附用法:若编译运行后弹出一大堆提示大概率是溢出了,好好看一下提示;若不弹出表示啥事没有

  6. -pg:查看程序瓶颈

    附用法:编译后运行可执行文件,运行后输入 gprof -b + 可执行文件名,可以查看程序运行概况,包括函数运行时间等。通过比较可以清晰知道自己那些函数容易超时(-b 指简略输出)