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", n

              end

对比:

           commands 1

           silent

           printf  "var value is %d\n", n

            end

GDB的define命令创建宏

           define print_and_go

           printf  "%d\n", 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 : 处理器状态

 

时间: 2024-12-02 10:32:45

GDB调试之暂停的相关文章

Xcode的gdb调试

关于GDB 对于大多数Cocoa程序员来说,最常用的debugger莫过于Xcode自带的调试工具了.而实际上,它正是gdb的一个图形化包装.相对于gdb,图形化带来了很多便利,但同时也缺少了一些重要功能.而且在某些情况下,gdb反而更加方便.因此,学习gdb,了解一下幕后的实质,也是有必要的. gdb可以通过终端运行,也可以在Xcode的控制台调用命令.本文将通过终端讲述一些gdb的基本命令和技巧. 首先,我们来看一个例子:     #import <Foundation/Foundation

比较全面的gdb调试命令

用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成.在这里并不是要和Win

《深入剖析Nginx》——第2章  跟踪与调试2.1 利用gdb调试

第2章 跟踪与调试 跟踪与调试,不仅是我们解决程序Bug的有力途径,也是帮助我们理解现有代码的有效方法.通过跟踪程序执行的过程,我们可以清楚地了解程序的内部逻辑,对于不明就里的实现细节,调试查看程序内部变量也能更好地帮助我们做出正确的理解.本章将介绍一些跟踪与调试程序的方法,除了最基本的 gdb 调试,我还将结合个人经验,介绍一些相对高级的应用技巧. 2.1 利用gdb调试 gdb是Linux下调试程序的常用工具,任何Linux开发工程师初学程序调试时第一个接触到的工具应该就是gdb.关于gdb

《深入剖析Nginx》一2.1 利用gdb调试

2.1 利用gdb调试 深入剖析Nginx gdb是Linux下调试程序的常用工具,任何Linux开发工程师初学程序调试时第一个接触到的工具应该就是gdb.关于gdb本身的详细用法,我们不多详述,读者可以参考gdb官网手册1,而在这里,我们将重点介绍一些与Nginx相关的注意点与调试技巧. 2.1.1 绑定Nginx到gdb 利用gdb调式Nginx,首先得在生成Nginx程序时把-g编译选项打开.当然,这并不是说不打开-g选项就无法用gdb调试它,只是会因为缺少相应的符号信息导致调试不便,而此

gdb调试命令的使用及总结

来源:http://www.jb51.net/article/36393.htm 参考:http://www.cnblogs.com/hankers/archive/2012/12/07/2806836.html 参考:http://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F 100个gdb技巧:https://github.com/hellogcc/100-gdb-tips/blob/master/sr

在Linux中如何使用gdb调试C程序

无论多么有经验的程序员,开发的任何软件都不可能完全没有 bug.因此,排查及修复 bug 成为软件开发周期中最重要的任务之一.有许多办法可以排查 bug(测试.代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复. 如果你是 C/C++ 程序员,或者使用 Fortran 和 Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器 - GDB - 可以帮你更轻松地调试代码 bug 以及其它问题.在这篇文章中,我们将讨论一下 GDB 调试

在 Linux 中如何使用 gdb 调试 C 程序

无论多么有经验的程序员,开发的任何软件都不可能完全没有 bug.因此,排查及修复 bug 成为软件开发周期中最重要的任务之一.有许多办法可以排查 bug(测试.代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复. 如果你是 C/C++ 程序员,或者使用 Fortran 和 Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器 - GDB - 可以帮你更轻松地调试代码 bug 以及其它问题.在这篇文章中,我们将讨论一下 GDB 调试

nginx模块_使用gdb调试nginx源码

工欲善其事必先利其器,如何使用调试工具gdb一步步调试nginx是了解nginx的重要手段. ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正. 熟悉gdb的使用 这里就不说了,谷歌一搜一堆,这里推荐一篇文章:GDB 命令详细解释 请重点看一下step,run,break,list,info,continue命令 下载nginx源码 这里使用nginx-1.0.14 src是源代码,auto文件夹是configure运行时候的各种命令集合 修改config并编译

gcc/g++编译器和gdb调试器

gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]4.连接目标代码,生成可执行程序[链接器ld] [参数详解]-x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C