调试器
调试器:
调试器是一个程序,可以在程序运行时查看变量的,内存位置,寄存器变化等信息。熟练使用调试器是软件开发的必备技能。
What's GDB ?
GNU symbolic debugger,一个符号式命令行调试器。所谓“符号式" (symbolic) ,意思是在执行程序时,可以使用在源代码中对变量和函数定义的名称,引用这些变量和函数。为了显示和翻译这些名称,调试器需要程序中变量类型和函数类型的相关信息,以及可执行文件中哪条命令对应到源文件中哪行代码的信息。这类信息以符号表( symbol table )的形式出现,当使用- g
选项进行编译和链接时,将生成符号表,符号表被包含在可执行文件中:
在由多个源文件组成的大型程序中,必须在编译每个模块时都使用-g
选项。
GDB的工作原理
GDB有两种工作模式:本地调试和远程调试
GDB ?启动 !
在 shell 命令提示符中输人 gdb 命令就可以启动 GDB 。 GDB 支持许多命令行选项与参数:
参数解析:
-
[options] :可选的操作选项,常用的如下
-
-verslon 、-v:
GDB 在控制台上输出它的版本和版权信息,然后退出,不会启动任何调试过程。
-
--quiet 、-silent:
GDB 启动一个交互式的调试过程,不显示版本和版权信息。
-
--help 、 -h:
GDB 显示它的命令行语法,它简要地描述所有的选项,然后退出,不会启动任何调试过程。
-
-args:
使用 --args 选项,启动一个调试会话,将命令行参数传人到被 GDB 加载用来的调试程序中。
在下例中, myprog 是被调试程序:
一 args 选项后面必须紧接着被调试程序。该命令由被调试程序名称以及它的参数组成,参数的次序与不采用 GDB 调试而是正常执行该程序时的次序一样。 --args 必须是 GDB最后出现的选项。
-
-symbols filename 、 -S filename:
如果调试符号表没有被包含在可执行文件中,可以使用-symbols 选项加载一个单独的符号表文件。 GDB 会从指定的文件中读取符号表信息。
-
-exec fllename 、 -e fllename:
指定要被调试的可执行文件。
-
-se fllename:
所指定的文件是希望使用 GDB 测试的可执行文件,并包括了符号表。这个选项通常不是必须的,如果 GDB 命令行包含了一个文件名,并且该文件名并非任何选项的参数,那么 GDB 会将首个出现的文件名视为-se 选项的参数。
-
-tty device 、 -t device:
调试器使用 device 作为被调试程序的标准输人和输出流。在下面的示例中,程序myprog 的标准 I / O 流会输出到终端/ dev/tty5。
-
-
[executable_file]: 要调试的可执行文件的路径。这个文件通常是你编译的程序。
-
[core_file]: (可选)核心转储文件,包含程序崩溃时的内存状态,通常用于分析程序错误。
调试核心文件(core file)是指在程序异常崩溃时生成的文件,包含了程序在崩溃时的内存状态和其他重要信息。通过分析这个文件,可以用来定位和修复潜在的问题。
-
[process_id]: (可选)正在运行的进程的 ID,可以用于附加调试已在运行中的程序。
下面的命令将直接启动调试器,不显示启动信息:
GDB的常用命令:
-
l : list 列出程序源码,一般展示十行,将要执行的那一行在中间。
显示源代码,并以该指定的行代码作为中心。
-
b : break 加上行号,在该行下断点
条件断点:
在该语法中,position可以是一个函数名或者一个行号,有没有文件名称都可以,expression必须是C语言的表达式(可以包含函数)
- d :delete 不带参数会删除所有的断点,带上断点的编号只会删除指定的断点
- r : run 运行到断点
- n : next 单步调试,执行一整行代码
- s : step 如果这一条程序包含函数,则会运行进去,在函数内的第一条语句中断程序执行。
- p : print 加上变量名,会显示出变量的值(GDB 的 print 命令输出具有 $number=value的格式)