零、写在前面
癸卯年七月中,Z老师讲解调试技。愿今年,RP人和,百事聚兴,乃重写终端篇,增其旧志,刻OI巨佬技巧于其上,属予作文以记之
(若无特殊说明,默认在 \(\texttt{Linux}\) 下操作)
壹、终端便利篇
一、目录表示
./
本级目录../
上级目录./ + 文件名
本级目录下的…… (可结合使用)(e.g../Desktop/1.cpp 指桌面下的 1.cpp 文件
)
二、清空
- \(\texttt{Windows}\) 中:
cls
只是隐藏命令,reset
才是清空命令 - \(\texttt{Linux}\) 中:
clear
reset
printf "\033c"
都行(貌似也可以Ctrl+L
?)
三、复制、粘贴与剪贴
\(\texttt{Windows}\) 中右键即可复制
\(\texttt{Linux}\) 中 Ctrl+C
表结束、终结的意思,复制、粘贴与剪贴应使用 Ctrl+Shift+C/V/X
四、程序不需要手动读入
./X < ./Y.in
把文件./Y.in
输入到./X
(一般为可执行文件)中./X > ./Z.out
把文件./X
输出结果输入到./Z.out
中
两者可以结合使用
需要注意的是,一但程序中使用了 freopen
,该两条命令将无效(但使用了 fopen
等还是可以用的)
贰、程序调试篇
(在终端中进行)
一、如何调用可执行文件
直接在终端中输入可执行文件名即可
e.g. 输入 ./a
并回车,表示运行 a
可执行文件
二、编译和编译选项
g++ XX.cpp
编译 XX.cpp
文件
但是光是这样编译,只会得到一个 a
的可执行文件(指编译出来的可执行文件命名不随被编译的文件名)
所以,我们需要以下一些命令来使该可执行文件更加方便调试:(直接加在上面那个很简约的命令后面即可)
-o + 编译出来的可执行文件名
: 顾名思义,用来命名可执行文件的(这样就不需要手动重命名了)-O1
或-O2
或-O3
: 吸氧,优化程序。理论上而言 \(\text{-O3}\) 比 \(\text{-O2}\) 更优,但比赛时默认开 \(\text{-O2}\)(\(\text{-O3}\) 更容易出现不可预期的错误,\(\text{-O1}\) 优化不明显?)-ftrapv
:用来查看int
类型是否溢出附用法:编译后运行可执行文件,如果弹出
Abroted
表示有变量溢出,如果不弹出表示啥事没有-lm
:链接数学库(但现在编译器都好像自动链接数学库了,所以加不加无所谓?)-fsanitize=address
:检查数组是否溢出附用法:若编译运行后弹出一大堆提示大概率是溢出了,好好看一下提示;若不弹出表示啥事没有
-pg
:查看程序瓶颈附用法:编译后运行可执行文件,运行后输入
gprof -b + 可执行文件名
,可以查看程序运行概况,包括函数运行时间等。通过比较可以清晰知道自己那些函数容易超时(-b
指简略输出)