Skip to content

调试器

调试器:

调试器是一个程序,可以在程序运行时查看变量的,内存位置,寄存器变化等信息。熟练使用调试器是软件开发的必备技能。

What's GDB ?

GDB在线文档

GDB

GNU symbolic debugger,一个符号式命令行调试器。所谓“符号式" (symbolic) ,意思是在执行程序时,可以使用在源代码中对变量和函数定义的名称,引用这些变量和函数。为了显示和翻译这些名称,调试器需要程序中变量类型和函数类型的相关信息,以及可执行文件中哪条命令对应到源文件中哪行代码的信息。这类信息以符号表( symbol table )的形式出现,当使用- g 选项进行编译和链接时,将生成符号表,符号表被包含在可执行文件中:

$ gcc -g gdb—example. c

在由多个源文件组成的大型程序中,必须在编译每个模块时都使用-g 选项。

GDB的工作原理

GDB有两种工作模式:本地调试和远程调试

GDB远程调试

GDB ?启动 !

在 shell 命令提示符中输人 gdb 命令就可以启动 GDB 。 GDB 支持许多命令行选项与参数:

$gdb [options] [executable_file [core_file | process_id]] 

参数解析:

  1. [options] :可选的操作选项,常用的如下

    • -verslon 、-v:

      GDB 在控制台上输出它的版本和版权信息,然后退出,不会启动任何调试过程。

    • --quiet 、-silent:

      GDB 启动一个交互式的调试过程,不显示版本和版权信息。

    • --help 、 -h:

      GDB 显示它的命令行语法,它简要地描述所有的选项,然后退出,不会启动任何调试过程。

    • -args:

      使用 --args 选项,启动一个调试会话,将命令行参数传人到被 GDB 加载用来的调试程序中。

      在下例中, myprog 是被调试程序:

      $ gdb --args myprog -d "$HOME" #这里的 -d和“$HOME”都是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。

      $ gdb myprog -t /dev/tty5
      
  2. [executable_file]: 要调试的可执行文件的路径。这个文件通常是你编译的程序。

  3. [core_file]: (可选)核心转储文件,包含程序崩溃时的内存状态,通常用于分析程序错误。

    调试核心文件(core file)是指在程序异常崩溃时生成的文件,包含了程序在崩溃时的内存状态和其他重要信息。通过分析这个文件,可以用来定位和修复潜在的问题。

  4. [process_id]: (可选)正在运行的进程的 ID,可以用于附加调试已在运行中的程序。

下面的命令将直接启动调试器,不显示启动信息:

$ gdb -silent #该命令没有指定要调试的文件,可使用file命令指定可执行文件

GDB的常用命令:

  • l : list 列出程序源码,一般展示十行,将要执行的那一行在中间。

    list fllename:line number
    

    显示源代码,并以该指定的行代码作为中心。

  • b : break 加上行号,在该行下断点

    条件断点:

    break [position] if expression
    

    在该语法中,position可以是一个函数名或者一个行号,有没有文件名称都可以,expression必须是C语言的表达式(可以包含函数)

  • d :delete 不带参数会删除所有的断点,带上断点的编号只会删除指定的断点
  • r : run 运行到断点
  • n : next 单步调试,执行一整行代码
  • s : step 如果这一条程序包含函数,则会运行进去,在函数内的第一条语句中断程序执行。
  • p : print 加上变量名,会显示出变量的值(GDB 的 print 命令输出具有 $number=value的格式)

Jlink工作模式

J-Link Commander - SEGGER 知識庫

J-Link 远程服务器

OpenOCD:

下载适用于 Windows 的 OpenOCD

OpenOCD笔记

OpenOCD简明指南