`
weihe6666
  • 浏览: 436155 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Linux GDB(四)

阅读更多
Linux GDB(四)


查看栈信息
—————

当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。

下面是一些查看函数调用栈信息的GDB命令:

    backtrace
    bt
        打印当前的函数调用栈的所有信息。如:
      
        (gdb) bt
        #0  func (n=250) at tst.c:6
        #1  0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
        #2  0x400409ed in __libc_start_main () from /lib/libc.so.6
      
        从上可以看出函数的调用栈信息:__libc_start_main --> main() --> func()
      
  
    backtrace <n>
    bt <n>
        n是一个正整数,表示只打印栈顶上n层的栈信息。

    backtrace <-n>
    bt <-n>
        -n表一个负整数,表示只打印栈底下n层的栈信息。
      
如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。

    frame <n>
    f <n>
        n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
  
    up <n>
        表示向栈的上面移动n层,可以不打n,表示向上移动一层。
      
    down <n>
        表示向栈的下面移动n层,可以不打n,表示向下移动一层。
      

    上面的命令,都会打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用这三个命令:
  
            select-frame <n> 对应于 frame 命令。
            up-silently <n> 对应于 up 命令。
            down-silently <n> 对应于 down 命令。

  
查看当前栈层的信息,你可以用以下GDB命令:

    frame 或 f
        会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。
  
    info frame
    info f
        这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。如:
            (gdb) info f
            Stack level 0, frame at 0xbffff5d4:
             eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
             called by frame at 0xbffff60c
             source language c.
             Arglist at 0xbffff5d4, args: n=250
             Locals at 0xbffff5d4, Previous frame's sp is 0x0
             Saved registers:
              ebp at 0xbffff5d4, eip at 0xbffff5d8
            
     info args
        打印出当前函数的参数名及其值。
   
     info locals
        打印出当前函数中所有局部变量及其值。
      
     info catch
        打印出当前的函数中的异常处理信息。
      
      
      
      
查看源程序
—————

一、显示源代码

    GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把源程序信息编译到执行文件中。不然就看不到源程序了。当程序停下来以后,GDB会报告程序停在了那个文件的第几行上。你可以用list命令来打印程序的源代码。还是来看一看查看源代码的GDB命令吧。
  
    list <linenum>
        显示程序第linenum行的周围的源程序。
  
    list <function>
        显示函数名为function的函数的源程序。
      
    list
        显示当前行后面的源程序。
  
    list -
        显示当前行前面的源程序。

一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。

    set listsize <count>
        设置一次显示源代码的行数。
      
    show listsize
        查看当前listsize的设置。
      

list命令还有下面的用法:

    list <first>, <last>
        显示从first行到last行之间的源代码。
  
    list , <last>
        显示从当前行到last行之间的源代码。
      
    list +
        往后显示源代码。
      

一般来说在list后面可以跟以下这们的参数:

    <linenum>   行号。
    <+offset>   当前行号的正偏移量。
    <-offset>   当前行号的负偏移量。
    <filename:linenum>  哪个文件的哪一行。
    <function>  函数名。
    <filename:function> 哪个文件中的哪个函数。
    <*address>  程序运行时的语句在内存中的地址。
  

二、搜索源代码

不仅如此,GDB还提供了源代码搜索的命令:

    forward-search <regexp>
    search <regexp>
        向前面搜索。

    reverse-search <regexp>
        全部搜索。
      
其中,<regexp>就是正则表达式,也主一个字符串的匹配模式,关于正则表达式,我就不在这里讲了,还请各位查看相关资料。


三、指定源文件的路径

某些时候,用-g编译过后的执行程序中只是包括了源文件的名字,没有路径名。GDB提供了可以让你指定源文件的路径的命令,以便GDB进行搜索。

    directory <dirname ... >
    dir <dirname ... >
        加一个源文件路径到当前路径的前面。如果你要指定多个路径,UNIX下你可以使用“:”,Windows下你可以使用“;”。
    directory
        清除所有的自定义的源文件搜索路径信息。
  
    show directories
        显示定义了的源文件搜索路径。
      

四、源代码的内存

你可以使用info line命令来查看源代码在内存中的地址。info line后面可以跟“行号”,“函数名”,“文件名:行号”,“文件名:函数名”,这个命令会打印出所指定的源码在运行时的内存地址,如:

        (gdb) info line tst.c:func
        Line 5 of "tst.c" starts at address 0x8048456 <func+6> and ends at 0x804845d <func+13>.

还有一个命令(disassemble)你可以查看源程序的当前执行时的机器码,这个命令会把目前内存中的指令dump出来。如下面的示例表示查看函数func的汇编代码。

        (gdb) disassemble func
        Dump of assembler code for function func:
        0x8048450 <func>:       push   %ebp
        0x8048451 <func+1>:     mov    %esp,%ebp
        0x8048453 <func+3>:     sub    $0x18,%esp
        0x8048456 <func+6>:     movl   $0x0,0xfffffffc(%ebp)
        0x804845d <func+13>:    movl   $0x1,0xfffffff8(%ebp)
        0x8048464 <func+20>:    mov    0xfffffff8(%ebp),%eax
        0x8048467 <func+23>:    cmp    0x8(%ebp),%eax
        0x804846a <func+26>:    jle    0x8048470 <func+32>
        0x804846c <func+28>:    jmp    0x8048480 <func+48>
        0x804846e <func+30>:    mov    %esi,%esi
        0x8048470 <func+32>:    mov    0xfffffff8(%ebp),%eax
        0x8048473 <func+35>:    add    %eax,0xfffffffc(%ebp)
        0x8048476 <func+38>:    incl   0xfffffff8(%ebp)
        0x8048479 <func+41>:    jmp    0x8048464 <func+20>
        0x804847b <func+43>:    nop
        0x804847c <func+44>:    lea    0x0(%esi,1),%esi
        0x8048480 <func+48>:    mov    0xfffffffc(%ebp),%edx
        0x8048483 <func+51>:    mov    %edx,%eax
        0x8048485 <func+53>:    jmp    0x8048487 <func+55>
        0x8048487 <func+55>:    mov    %ebp,%esp
        0x8048489 <func+57>:    pop    %ebp
        0x804848a <func+58>:    ret
        End of assembler dump.
分享到:
评论

相关推荐

    Linux GDB调试文档

    在Linux开发环境中,GDB(GNU调试器)是进行源码级调试的重要工具,尤其适用于C/C++语言编程。其全称为"The gnu Source-Level Debugger",是GNU项目的一部分。随着版本*.*.*.**的发布,GDB不仅保持了其作为源码级...

    gdb完全手册.pdf.zip_GDB pdf_GDB中文手册_gdb_linux_linux gdb pdf

    1. **GDB安装**:介绍如何在Linux环境中安装GDB,包括通过包管理器或源码编译的方式。 2. **基本使用**:讲解如何启动GDB,设置源代码路径,以及加载调试目标。 3. **断点管理**:详述如何设置、删除和启用/禁用...

    Linux GDB C/C++调试基础与提升课程

    分享一套课程——Linux GDB C/C++调试基础与提升视频课程,提供源码+PPT下载。

    Linux绿色gdb,无需安装,支持c++对象

    Linux中的GDB(GNU调试器)是一款强大的源代码级调试工具,主要用于C和C++程序。这个绿色版的GDB意味着它是一个便携式的版本,无需通过编译或配置系统级别的安装过程,用户可以直接在指定目录下运行。这使得在不同...

    linux gdb 调试手册

    在Linux操作系统中,GDB(GNU调试器)是一款强大的命令行工具,用于调试C、C++、Fortran、Python等编程语言编写的程序。这款工具允许开发者在运行时检查程序的状态,包括变量值、内存区域、调用栈等,帮助找出程序中...

    linux gdb命令手册

    【Linux GDB命令手册】 GDB(GNU Debugger)是一款强大的调试工具,主要用于C和C++程序,但也支持其他语言。在Linux环境下,GDB可以帮助开发者定位和修复代码中的错误,提高软件的质量。以下是对GDB命令的详细说明...

    gdb最新安装包(Linux版)

    Gdb,全称为GNU调试器(GNU Debugger),是一款强大的开源调试工具,主要用于C、C++以及其他支持的语言在Linux操作系统上的程序调试。它允许开发者在运行时检查程序的状态,包括变量值、内存空间、调用堆栈等,从而...

    Linux下GDB的移植

    Linux下GDB的移植 GDB是GNU开放源代码的调试器,广泛应用于Linux系统中。为了在Linux下进行程序调试,需要将GDB移植到目标平台上。本文将详细介绍GDB的移植步骤,包括准备工作、编译ncurses、编译GDB、测试等环节。...

    嵌入式Linux GDB调试技术

    嵌入式Linux GDB调试技术 嵌入式Linux GDB调试技术是指在嵌入式系统中使用GDB调试程序的一种技术。GDB(GNU Debugger)是一种功能强大且灵活的调试器,可以在各种平台上使用。嵌入式Linux GDB调试技术的主要目的是...

    Linux gdb 调试技术.pptx

    linux下使用gdb调试程序的教程。 详细讲解gdb工具的使用,以及调试技巧等。 linux上常用调试技术: 走读代码 打印日志 /proc/pid/... gdb、dbx strace、ltrace valgrind

    arm-linux-gdb

    ### ARM-Linux-GDB 构建与调试指南 #### 概述 在嵌入式开发领域,ARM架构因其低功耗、高性能等特性被广泛应用。为了有效地进行ARM平台上的程序调试,开发人员通常会选择使用ARM-Linux-GDB(以下简称GDB)。本文将...

    linuxGDB调试CC++入门.pdf

    Linux GDB 调试 C++ 入门 GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。它可以帮助开发者完成四个方面的功能:启动程序、设置断点、检查程序状态和动态改变执行环境。与图形化调试工具相比,GDB ...

    Linux课件:GDB调试简明指南.pdf

    Linux 调试工具 GDB 简明指南 GDB(GNU Debugger)是 Linux 系统中的一款强大调试工具,用于调试 C 和 C++ 程序。它使用户可以在程序运行时观察程序的内部结构和内存的使用情况。GDB 提供了多种功能,如监视程序中...

    linux gdb test example

    linux gdb test example

    Linux下gdb调试工具指南

    ### Linux下gdb调试工具指南:深入解析与实践 #### 引言 在软件开发领域,尤其是对于系统级编程和复杂应用的维护,一个高效、功能全面的调试工具是不可或缺的。GNU调试器(GDB)正是这样一款强大的调试工具,它...

    Linux GDB 中文完全手册

    Linux GDB中文完全手册是一本全面介绍在Linux环境下如何使用GNU调试器(GDB)的教程,特别适合初入Linux开发领域的学习者,尤其是对英文文档理解有困难的开发者。GDB是一款强大的源代码级调试器,它允许程序员在运行...

    linux 使用GDB调试 资料

    在Linux操作系统中,GDB(GNU Debugger)是一个强大的命令行工具,用于调试C、C++以及其他支持的语言编译的程序。GDB可以帮助开发者追踪代码执行流程,定位和修复程序中的错误,是Linux环境下进行软件开发不可或缺的...

    linux下GDB调试

    ### Linux 下 GDB 调试工具详解 #### GDB 概述 GDB(GNU Debugger)是一款由GNU项目开发的、广泛应用于Unix系统及类Unix系统的强大调试工具。它支持C、C++、Objective-C、Ada以及Pascal等多种语言,并能够通过标准...

    linux下gdb使用

    Linux下的GDB(GNU Debugger)是一款强大的调试工具,用于帮助开发者在程序运行时发现和修复错误。当程序出错并产生core dump文件时,GDB能够帮助快速定位问题所在,从而提高调试效率。以下是关于GDB使用的一些关键...

Global site tag (gtag.js) - Google Analytics