• GDB调试之暂停


    暂停机制: 有3种方式可以通知GDB暂停程序的执行。

              a.断点: 通知GDB在程序中的特定位置暂停执行;

              b.监视点:通知GDB当特定内存位置(或者涉及一个或多个位置的表达式)的值发生变化时暂停执行;

              c.捕获点: 通知GDB当特定事件发生时暂停执行;

    容易混淆的是,在GDB文档中将这3个机制都称为断点。这可能是因为它们的很多属性和命令都相同;

    GDB关于删除断点的delete命令:删除断点、监视点和捕获点;

    GDB中关于“位置”的含义非常灵活,它可以指各种源代码行、代码地址、源代码文件中的行号或者函数的入口等;

               设置格式: 文件名:行号

    断点可以通过函数名,当前文件内的行号来设置,也可以先指定文件名再指定行号,还可以指定与暂停位置的偏移量,或者用地址来设置;

    程序员创建的每个断点(包括断点、监视点、和捕获点)都被标识为从1开始的唯一整数标识符;这个标识符用来执行该断点上的各种操作,

             break function   在函数function() 的入口(第一行可执行代码)处设置断点,

          例如: break main 在源文件filename的line处设置断点,如果filename不在当前目录中,则可以给出相对路径名或者完全路径名来帮助GDB查找该文件。

          例如: break  source/bed.c:35 break bed.c:function

          临时断点(只生效一次): 使用tbreak命令设置,它与break采用相同类型的参数,

      在任何给定时间,GDB都有一个焦点,可以将它看作当前“活动”文件,这意味着除非对命令做了限定。否则都是在具有GDB的焦点的文件上执行命令。

               默认情况下,具有GDB的初始焦点的文件是包含main()函数的文件,但是当发生如下任一动作时,焦点会转移到不同的文件上;

                       1、向不同的源文件应用list命令; list function

                       2、进入位于不同的源文件文件中的代码;

                       3、当在不同的源代码文件中执行代码时GDB遇到断点; 在调试会话期间不应退出GDB,

            例如,当发现并修复了一个程序错误,但是其他程序错误仍然存在时,不应当退出GDB然后重新进入来使用程序的新版本。这样做有些不必要地繁琐, 而且还会不得不重新进入断点; 如果在修改和重新编译代码时没有退出GDB,那么下次执行GDB是的run命令时,GDB会感知到代码修改,并自动重新加载新版本;

              假如要关机了,又想保存GDB的断点等信息;那怎么办呢? 可以将断点放在源代码所在目录的.gdbinit 启动文件中;

              例如,当发现并修复了一个程序错误,但是其他程序错误仍然存在时,不应当退出GDB然后重新进入来使用程序的新版本。这样做有些不必要地繁琐, 而且还会不得不重新进入断点; 如果在修改和重新编译代码时没有退出GDB,那么下次执行GDB是的run命令时,GDB会感知到代码修改,并自动重新加载新版本;

                 如果要波啊流断点以便用户使用,暂时又不希望GDB停止执行; 可以禁用它们,在以后需要时再启用。

          使用disable breakpoint-list命令禁用断点。

                 enable breakpoint-list命令启用断点;

                      其中breakpoint_list是使用空格分隔的列表,其中有一个或多个断点标识符;

                    disable不带参数执行,将禁用所有现有断点,enable也一样; i b命令也能指出特定断点引起GDB停止程序执行多是次; 使用commands命令设置命令列表:

                  其中breakpoint-number是要将命令添加到其上的断点的标识符,commands是用新行分隔的任何有效GDB命令列表。

                  逐条输入命令,然后键入end表示命令完毕。

                  从那以后,每当GDB在这个断点处中断时,它都会执行你输入的任何命令。

                  commands breakpoint-number

                  ......

                 commands

                 ......

                 end

    例如:

                 commands 1

                 printf   "var value is %d ", n

                  end

    对比:

               commands 1

               silent

               printf  "var value is %d ", n

                end

    GDB的define命令创建宏

               define print_and_go

               printf  "%d ", n

               continue

               end

    监视点: 它是一种特殊类型的断点,是要求GDB暂停程序执行的指令。

              区别在于监视点没有“住在”某一行源代码中,而是,监视点是指示GDB每当某个表达式改变了值就暂停执行的指令。

     例如:

                watch i 它会使得每当i改变值时GDB就暂停;

                display命令(简写disp):这个命令要求GDB在执行中每次有暂停(由于有断点,使用next、step命令等)时就输出指定条目;

                 disp i 查看i的值; 通过GDB中的call命令来调用源代码中的函数:

                例如:

                       commands 2

                       printf "************"

                       call function(参数)

                        end

     人工数组(artificial array)

                          *pointer@number_of_elements p

                           p         *x@25 GDB中, (监视局部变量)

                          info locals 命令得到当前栈帧中哦所有局部变量的值列表;

                         GDB中检查内存 在有些情况下,可能希望检测给定地址的内存,而不是通过变量的名称。

                       x命令; p/x var GDB中设置当前的某个变量的值;

                        set x = 12 set args命令设置程序的命令行参数:

                        set args 1 2 4 检查当前函数参数的info args命令:

     全局变量:errno 在文件/usr/include/linux/errno.h    或 /usr/include/asm-generic/errno.h  中有对错误数值的详细解释;

    使用strace,跟踪程序做过的所有系统调用;

    关于网络的调试,Ethereal程序跟踪单个TCP/IP分组;

    与线程相关的GDB命令用法汇总:

    确定每个线程在做什么,可以通过 GDB的info threads来确定:

    检查线程1:   thread  1

    break  88 thread  3 (当线程3达到源代码行88时停止执行)

    break 88  thread 3 if  x==y  (当线程3到达3源代码行88,并且变量x和y相等时停止执行)

    layout next 命令: 源代码、汇编、二进制之间转换

     还有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了每一台计算机中实际使用的4个寄存器的标准名字:

      $pc  : 程序计数器

      $fp  : 帧指针(当前堆栈帧)

      $sp : 栈指针

      $ps : 处理器状态

  • 相关阅读:
    SqlServer事务语法及使用方法
    mysql解决自动断开8小时未曾用过的链接
    JIRA license申请和语言包下载
    String literal is not properly closed by
    android开发 NDK 动态链接多个第三方库(so)
    vim字符串替换
    VMware tools的用途及安装[跨系统文件拖拽]
    十大高明的Google搜索技巧
    安装ADT-20.0.3的时候产生org.eclipse.cdt.feature.group 0.0.0' but it could not be ..
    [Android NDK]修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 问题
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3783434.html
Copyright © 2020-2023  润新知