CLion & GDB

CLion 操作指南

      • 需知
      • Tip of the day
      • 配置环境变量等
      • Git
      • Compile
      • Debug
      • GDB调试
      • Refactor

需知

参考https://blog.jetbrains.com/clion/
自动生成的cmake-build-debug文件夹下不包括可执行文件,需要自己手动run/build
cmake-build-debug中自动运行的CMake和终端中CMake版本不同。


Tip of the day

  • Help -> Tip of the day
  • Edit->Find Usages->Highlight Usages in File
    Ctrl+Shift+F7高亮所有文本.F3和 Shift+F3切换上、下一个到高亮区域。Escape移除高亮
  • View->Tool Windows->Structure
    Alt+7显示程序的结构组成:类、函数、变量等。
  • Ctrl+左键文件名(标签栏)可以选择打开其所属的各级目录
  • Ctrl + X剪切光标所在整行代码
  • Ctrl + Y 恢复撤销
  • Ctrl + D复制整行代码,并粘贴到下一行中
  • Shift + F6对文件重命名,如果修改变量名出现了Rename框,表示修改会失败 。 记得检查语法错误再修改。
  • Ctrl + F4关闭当前窗口
  • 双击 Shift开启查找界面
  • Alt+Shift+Left/Right回退和前进
  • 可以直接在project导航栏里搜索文件
  • Ctrl+Shift+V 可以查看粘贴板
  • Ctrl+Alt+V 重构指定变量。类似与 ubuntu 指令的 alias,将长的表达式变成自命名的变量。使用该方法之后,程序中所有该代码段将自动化变为自命名的变量。
  • Alt+Insert 可以自动生成构造函数、析构函数、重载输出流、重载比较运算符等
  • Ctrl+F搜索栏,Ctrl+R替换栏;Ctrl+Shift+F文件内的搜索,Ctrl+Shift+R文件内的替换
  • Ctrl+Shift+Up/Down 可以任意移动整行代码在域内
  • Ctrl+/行注释,Ctrl+Shift+/块注释
  • Ctrl+Alt+T 快速包装代码块,如将语句放到if的语句体中(快捷键和终端冲突)。可以通过工具栏Code->Surround with来设置
  • Ctrl+Shift+Enter 自动生成代码所需的语句体{},如分支、循环结构、类等
  • Ctrl+Q快速查询函数、类、命名空间的定义
  • Settings -> Editor-> Live Templates中可以查阅模板。比如c++中有for的三种循环。输入for,再Tab,自动生成循环模板。输入iter,再Tab,自动生成range循环。输入itit,再Tab,自动生成迭代器循环模板。
  • CLion会自动关联在同一目录下cpp文件中相同的函数,为了消除不同cpp文件中由于同名引起的函数错误关联的行为,如函数定义声明类的继承关系等。可以使用命名空间:如果在不同的cpp文件中存在相同名称的函数或变量,可以将它们分别放在不同的命名空间中,以避免冲突。(本人目前没有找到如何取消这种无意义关联)
  • Ctrl+Alt+L 可以整体缩进代码块到正确位置

配置环境变量等

Run -> Edit Configurations -> Working directory / Environment variables
其中 Target目标文件,Executable可执行文件,在大工程下由于make内容比较多,也需要选择对应的。


Git

Git功能上传代码到github时,commit到错误的文件。可以通过Git->Reset HEAD来恢复。
Reset Head中的Reset Type选择MixedTo Commit修改参数为HEAD^/HEAD~1 或者 HEAD^^/HEAD~2等。
其中HEAD^或者HEAD~1撤回上一个版本,(想要恢复的版本)。
HEAD^^或者HEAD~2撤回上两个版本


Compile

编译详见《CMake》
修改CLion编译器,如gccclang等,File -> Settings -> Build,Execution,Deployment -> ToolChains/CMake中可以修改。其中ToolChains是全局编译器,修改之后会对所有的可编译文件作用;CMake是当前文件编译器,修改仅对当前可编译文件使用。注:CMake的修改会覆盖ToolChains的设置。


Debug

Run -> Debuggings Actions中有响应的功能
设置断点之后,有F7step into、F8step over、Shift+F8step out三种调试

  • into 是单步执行,遇到子函数就进入子函数并且继续单步执行 – (into 进入)
  • over 也是单步执行,但遇到子函数时,将子函数当成一整步,执行完后再停止。当程序没有子函数时,同 into – (over 覆盖)
  • out 当单步执行到子函数内时,用 out 就可以执行完剩余子函数部分,并返回到上一层 – (out 出去)

F7step into可用于递归函数的调试。

Debugger 下的 Variables 也会显示变量的实时变化

Debugger所在的控制栏中,有Evaluate Expression可以用来看生命周期没结束的变量,或给表达式赋值。也可以在代码上直接操作。
也可以自己设置watches,最好是从代码复制过来,因为手写watchpointer可能会有类型转换等问题。


GDB调试

详见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 显示下一个layout
    layout prev 显示上一个layout
    显示窗口之后,可以通过方向键来辅助查看代码
    Ctrl + 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查看反汇编代码

showinfo相对应,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

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:

  • Variable (Ctrl+Alt+V on Windows/Linux, Alt+Cmd+V on OS X)
  • Constant (Ctrl+Alt+C on Windows/Linux, Alt+Cmd+C on OS X)
  • Parameter (Ctrl+Alt+P on Windows/Linux, Alt+Cmd+P on OS X)
  • Typedef (Ctrl+Alt+K on Windows/Linux, Alt+Cmd+K on OS X)
  • Define (Ctrl+Alt+D on Windows/Linux, Alt+Cmd+D on OS X)
  • Method (Ctrl+Alt+M on Windows/Linux, Alt+Cmd+M on OS X)
  • Superclass
  • Subclass

若程序中的函数转不到定义或者声明的时候,记得将该程序目录直接置于IDE中,为了方便IDE自动生成cmake-buile-debug文件,便于搜索定义或声明。或者直接选择CMakeLists文件进行Load CMAKE PROJECT

你可能感兴趣的:(工具,工具库,c++,ide)