0%

Linux 调试预备知识

预备知识

处于TUI模式的GDB

加上-tui选项可以在调用GDB时使用TUI模式运行,或者当处于非TUI模式时在GDB中使用Ctrl+A+X组合键就可以在TUI模式和非TUI模式中跳转。

在GUI模式中,GDB窗口划分为两个子窗口:

  • 用于输入GDB命令的窗口
  • 用于查看源码的窗口

通过使用上下方向键可以在TUI模式中移动到代码的其他部分。如果没有处于TUI模式中,就可以使用箭头键来浏览以前的GBD命令,从而修改或重复执行这些命令。

在TUI模式中,箭头键用于滚动源代码子窗口,可以使用Ctrl+P和Ctrl+N组合键来浏览以前的GDB命令。

常用的命令

  • backtrace:显示程序的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)。
  • breakpoint:在程序中设置一个断点。
  • cd:改变当前工作目录。
  • clear:删除刚才停止处的断点。
  • commands:命中断点时,列出将要执行的命令。
  • continue:从断点处开始继续执行。
  • delete:删除一个断点或监测点,也可与其他命令一起使用。
  • display:程序停止时显示变量和表达式。
  • down:下移栈帧,使得另一个函数成为当前函数。
  • frame:选择下一条continue命令的帧。
  • info:显示与该程序有关的各种信息。
  • info break:显示当前断点清单,包括到达断点处的次数等。
  • info files:显示被调试文件的详细信息。
  • info func:显示所有的函数名称。
  • info local:显示当前函数中的局部变量信息。
  • info prog:显示被调试程序的执行状态。
  • info var:显示所有的全局和静态变量名称。
  • jump:在源程序中的另一点开始运行。
  • kill:异常终止在gdb 控制下运行的程序。
  • list:列出相应于正在执行的程序的源文件内容。
  • next:执行下一个源程序行,从而执行其整体中的一个函数。
  • print:显示变量或表达式的值。
  • pwd:显示当前工作目录。
  • pype:显示一个数据结构(如一个结构或C++类)的内容。
  • quit:退出gdb。
  • reverse-search:在源文件中反向搜索正规表达式。
  • run:执行该程序。
  • search:在源文件中搜索正规表达式。
  • set variable:给变量赋值。
  • signal:将一个信号发送到正在运行的进程。
  • step:执行下一个源程序行,必要时进入下一个函数。
  • undisplay display:命令的反命令,不要显示表达式。
  • until:结束当前循环。
  • up:上移栈帧,使另一个函数成为当前函数。
  • watch:在程序中设置一个监测点(即数据断点)。
  • whatis:显示变量或函数类型。

CGDB

CGDB是一个很友好的GDB界面,当然是相对于GDB的TUI界面,CGDB也是GDB的前端,虽然CGDB类似于基于终端的TUI的概念,但其在色彩方面特别有吸引力,而且可以浏览源代码子窗口,并直接在子窗口中设置断点,并且CGDB处理屏幕刷新的能力似乎也比GDB的TUI强。

CGDB的基本命令与约定:

  • 按下ESC键可以从基本命令转到源代码窗口,按下i键返回;
  • 当光标在源代码窗口中时,可以使用箭头键或者类似vi的操作在源码中随意移动,j下k上/查找;
  • 要执行的下一行用箭头标记;
  • 为了在通过光标突出显示的当前代码行上设置断点,只要按下空格键即可;
  • 断点行的行号用红色突出显示

编译:gcc -g -Wall -o gdb_app test.c

Attention:其中的-g选项可以让编译器将符号表(即对应程序的变量和代码行的内存地址列表)保存在生成的可执行文件。这是一个绝对必要的步骤,这样才能在调试会话过程中引用源代码中的变量名和行号。

处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道