参考https://blog.jetbrains.com/clion/
自动生成的cmake-build-debug
文件夹下不包括可执行文件,需要自己手动run/build
。
cmake-build-debug
中自动运行的CMake
和终端中CMake
版本不同。
Help
-> Tip of the day
Edit
->Find Usages
->Highlight Usages in File
View
->Tool Windows
->Structure
Rename
框,表示修改会失败 。 记得检查语法错误再修改。project
导航栏里搜索文件ubuntu
指令的 alias
,将长的表达式变成自命名的变量。使用该方法之后,程序中所有该代码段将自动化变为自命名的变量。Code
->Surround with
来设置{}
,如分支、循环结构、类等Settings
-> Editor
-> Live Templates
中可以查阅模板。比如c++中有for
的三种循环。输入for
,再Tab,自动生成循环模板。输入iter
,再Tab,自动生成range
循环。输入itit
,再Tab,自动生成迭代器循环模板。CLion
会自动关联在同一目录下cpp
文件中相同的函数,为了消除不同cpp
文件中由于同名引起的函数错误关联的行为,如函数定义与声明,类的继承关系等。可以使用命名空间:如果在不同的cpp
文件中存在相同名称的函数或变量,可以将它们分别放在不同的命名空间中,以避免冲突。(本人目前没有找到如何取消这种无意义关联)Run
-> Edit Configurations
-> Working directory / Environment variables
等
其中 Target
目标文件,Executable
可执行文件,在大工程下由于make
内容比较多,也需要选择对应的。
用Git
功能上传代码到github
时,commit
到错误的文件。可以通过Git
->Reset HEAD
来恢复。
Reset Head
中的Reset Type
选择Mixed
, To Commit
修改参数为HEAD^/HEAD~1
或者 HEAD^^/HEAD~2
等。
其中HEAD^
或者HEAD~1
撤回上一个版本,(想要恢复的版本)。
HEAD^^
或者HEAD~2
撤回上两个版本
编译详见《CMake》
修改CLion
编译器,如gcc
、clang
等,File
-> Settings
-> Build,Execution,Deployment
-> ToolChains/CMake
中可以修改。其中ToolChains
是全局编译器,修改之后会对所有的可编译文件作用;CMake
是当前文件编译器,修改仅对当前可编译文件使用。注:CMake
的修改会覆盖ToolChains
的设置。
Run
-> Debuggings Actions
中有响应的功能
设置断点之后,有F7step into
、F8step over
、Shift+F8step out
三种调试
F7step into
可用于递归函数的调试。
Debugger
下的 Variables
也会显示变量的实时变化
Debugger
所在的控制栏中,有Evaluate Expression
可以用来看生命周期没结束的变量,或给表达式赋值。也可以在代码上直接操作。
也可以自己设置watches
,最好是从代码复制过来,因为手写watchpointer
可能会有类型转换等问题。
详见https://www.gnu.org/software/gdb/
GNU Debugger 是GDB的全称,是用于运行在 Unix 系列的调试器。
目前接触到的优于IDE的调试是可以实现调试回滚。
断点所在行不执行。 在终端进入 GDB 调试模式,也可以在 Clion 中Debug
->Debugger
->GDB
找到,但需要先设置断点,GDB才能进入输入模式。CLion下的gdb调试会有点问题。
终端下(系统中)安装的 GDB 和 Clion 的 GDB 是分开版本的。
通过终端进入 GDB 调试,可以直接输入 gdb file_name
。也可以通过终端先输入gdb
后,输入 gdb file_name
。在终端使用 GDB 时,需要将切换出的 GDB 进入到生成的可执行文件file file_name
。
需要注意的是file_name
是生成的可执行程序,而不是源文件,且输入正确的程序的路径。可以找到IDE生成的程序或者通过g++
: g++ -g -o NAME name.cpp
layout
一边看代码,一边调试。layout src
显示源代码窗口layout next
显示下一个layoutlayout prev
显示上一个layoutCtrl + L
刷新窗口。run/r
运行程序shell ....
使用终端命令前加shell
,也可以只输入shell
进入终端模式,再exit
退回到gdb模式(仅适用于终端)quiz/q
退出调试模式,next/n
不进入子函数的单步运行,不用每一次都输入n,第二次直接回车就行step/s
进入子函数的单步运行reverse
调试回滚,就是调试中执行回上一步reverse-continue/rc
返回断点reverse-step/rs
返回单步reverse-next/rn
返回不进入的单步,不用每一次都输入rn,第二次直接回车就行target record-full
,设置断点之后,记得开启记录模式。finish
从函数内部退出list/l
显示函数,也可以显示指定行。默认显示10行,可以通过set listsize 20
设置为20,list 10
以第十行为中点,显示代码。list 5-10
显示5-10行的代码。list function_name
显示函数,以函数定义行数为中点。set
set args
设置参数,可以设置环境变量或者argv[1]
等。对于 Clion 来说,直接配置Run
->Edit configuration
-> Program arguments
set var variable = value
强制设置变量的值set follow-fork-mode parent
调试父进程(默认),set follow-fork-mode child
调试子进程set detach-on-fork on/off
设置调试进程模式,默认是on
,表示调试当前进程,其他进程继续运行set scheduler-locking on
其他线程被挂起,默认情况下是off
,即运行全部线程set trace-commands on
set logging on
输出GDB调试日志,因为GDB没有先前翻页的功能。文件输出位置为终端当前所在目录。set logging off
停止记录。break/b
设置断点,可以是函数名称,也可以是行数,若为多个文件下的断点,采用filename:linenum
的语法指定断点。若只有break
没有任何参数,则在下一个将要被执行的行上加断点。条件断点b linenum if expr
当expr
为真时,在linenum
行设置断点,注意在expr
的生命周期内设置。continue/c
断点之后,继续运行,可以运行到下一个断点info
info breakpoints
输出断点信息。Disp
显示keep
表示当执行到该断点后,断点将被保存。Enb
是否激活当前断点,可以设置disable num
来不激活指定序号的断点,仍保留断点;enable num
再重新激活指定序号的断点。info line num
显示指定序号行数信息、地址等info inferiors
显示进程信息。若有多个进程时,进程序号前有*
的表示为当前进程info threads
显示线程相关信息inferior num
切换进程编号delete/d
删除断点。d num
删除指定序号断点,序号可以用info breakpoints
来显示。d
删除所有断点。delete display variable
删除显示的变量watch
设置看点watch variable
当设置的变量改变时,显示信息。show
show detach-on-fork
显示进程模式show scheduler-locking
显示线程模式thread
thread 线程编号
切换线程thread apply 线程编号 gdb命令
指定某线程执行命令。如thread apply all gdb命令
,可让全部线程执行同一个命令。print variable
打印出变量的值,也可以强行赋值给变量print variable = 10
,让变量直接在给定的值下运行,程序也在给定值的基础上继续运行。print function_name()
也可以调用函数display variable
随着命令行一直显示变量的值。jump linenum
强行跳转至指定行call function_name()
强行调用函数return
强制返回函数。若无返回值,直接return
即可。有返回值return value
返回指定值。backtrace/bt
分析程序崩溃原因,显示序号num
。(在调试大的程序时,不可避免的调用到库,开源库出错的几率会小于自己手写的程序。因此,主要找自己程序的错误,从下往上找)frame num
根据bt
所生成的错误序号,找出错误原因。disassemble
查看反汇编代码show
和info
相对应,show
是显示调试器本身的信息,而info
则显示被调试任务的信息。
查询指令的具体操作,可在gdb
中输入help *
查询*
指令。
Debug
工具栏中的Resume Program
会跳过一些无用的断点,如定义函数的变量等。
调试Segmentation fault
(核心转储)问题:(使用终端调试,不使用CLion)
在当前终端执行 ulimit -a
检查core file size
是否为 unlimited
,如果是0
的话,输入指令ulimit -c unlimited
进行更改。
运行一次程序后
sudo su #进入管理者模式,用sudo指令权限不够
#将信息调出。%e程序的文件名,%p表示进程的ID,%t显示创建的时间
echo "core-%e-%p-%t" > /prop/sys/kernel/core-pattern
gdb EXEFILE CORFILE
Refactor
->Extract/Introduce(提取/引入)
-> Variable
Extract refactoring – CLion analyzes the block of code where the refactoring was invoked, detects input and output variables, together with the usages of the selected expression to replace them with the newly created:
若程序中的函数转不到定义或者声明的时候,记得将该程序目录直接置于IDE中,为了方便IDE自动生成cmake-buile-debug
文件,便于搜索定义或声明。或者直接选择CMakeLists
文件进行Load CMAKE PROJECT