zoukankan      html  css  js  c++  java
  • [转]GDB

    如何在gdb中关联源代码

    gdb调试coredump文件,设置core文件名与路径 bt可打印对应 函数(参数)、文件名、函数内的具体行数,查看具体代码则需要关联源码文件

    调试core文件主要命令

    gdb <binary> <path_of_corefile>
    bt, bt full    // 出现???原因是没有完整加载,搜索路径下没有可执行文件依赖的动态库
    frame <frame_num>
    up/down:向上/下帧栈
    
    
    info frame           //
    info registers
    info args
    info locals          // 当前帧的变量
    info variables
    info functions
    
    x
    /nxb addr: 含义为以x格式(16进制)打印从addr开始的n个长度单元为b(byte)的内存值 x/s: 以ascii码打印字符串
    set print elements 0 // 打印变量时,显示全部内容 set print pretty on // 每行只会显示结构体的一名成员,而且还会根据成员的定义层次进行缩进 set print object on // 当打印一个对象时,缺省是按照声明的类型进行打印,该设置按照派生类型进行打印
    print <variable_name> // https://visualgdb.com/gdbreference/commands/print print array[index]@num // 数组array打印从index下标起的num个数值 print *(myVector._M_impl._M_start)@myVector.size() // 打印vector(如myVector) print *(myVector._M_impl._M_start)@N // 打印vector第N个元素

    其他

    gcc -g  main.c                      //在目标文件加入源代码的信息
    gdb a.out       
    
    (gdb) start                         //开始调试
    (gdb) n                             //一条一条执行
    (gdb) step/s                        //执行下一条,如果函数进入函数
    (gdb) backtrace/bt                  //查看函数调用栈帧
    (gdb) info/i locals                 //查看当前栈帧局部变量
    (gdb) frame/f                       //选择栈帧,再查看局部变量
    (gdb) print/p                       //打印变量的值
    (gdb) finish                        //运行到当前函数返回
    (gdb) set var sum=0                 //修改变量值
    (gdb) list/l 行号或函数名             //列出源码
    (gdb) display/undisplay sum         //每次停下显示变量的值/取消跟踪
    (gdb) break/b  行号或函数名           //设置断点
    (gdb) continue/c                    //连续运行
    (gdb) info/i breakpoints            //查看已经设置的断点
    (gdb) delete breakpoints 2          //删除某个断点
    (gdb) disable/enable breakpoints 3  //禁用/启用某个断点
    (gdb) break 9 if sum != 0           //满足条件才激活断点
    (gdb) run/r                         //重新从程序开头连续执行
    (gdb) watch input[4]                //设置观察点
    (gdb) info/i watchpoints            //查看设置的观察点
    (gdb) x/7b input                    //打印存储器内容,b--每个字节一组,7--7组
    (gdb) disassemble                   //反汇编当前函数或指定函数
    (gdb) si                            // 一条指令一条指令调试 而 s 是一行一行代码
    (gdb) info registers                // 显示所有寄存器的当前值
    (gdb) x/20 $esp                    //查看内存中开始的20个数

     

    一、启动程序

    如果在启动gdb时没有指明程序,可以使用命令file或exec-file加载程序;

    run(r):

      run(r)命令使程序启动,可以在run命令中指明程序参数;值得注意的是,首次运行run后,如果再次执行run并且不带参数,会以之前的参数运行程序。

    set args:

      指定程序的参数。set args后,run可以不带参数而以指定的参数运行程序。如果set args不太参数,清楚程序参数,执行run后程序不太参数运行。

      在加载程序后,如果程序重新编译,gdb会根据符号文件的更改时间自动重载加载符号文件,所以,不需要重新加载文件。

     start:

      使用start命令使程序停在main函数的第一条语句。

     

    二、调试已经在运行的程序

    attach pid:

      从ps获得进程号,通过attach命令连接到该进程。attach一个进程后,gdb首先stop该进程,这样就可以设置断点,执行step、continue等命令;如果执行r命令,会杀掉原来的进程。

    detach:

      释放该进程,原进程会继续执行。

     

    三、调试多个inferiors和程序

      gdb允许在一个会话下调试多个程序,比如一个进程fork出两个或者多个进程,或者把当前程序复制出一个副本,这些都是通过inferior实现控制。

    info inferiors:

      显示当前管理的inferiors。

    inferior infono:

      切换到对应的inferior。

    add-inferior [-copies n] [-exec executable]:

      添加n(默认为1)个inferior,如果指明executable文件,可以以后通过file加载符号文件。

    clone-inferiror [-copies n] [infno]:

      复制编号为infno(默认为当前)的inferior。

    其它相关命令:

      remove-inferiors infno

      detach inferior infno

      kill inferiors infno

      maint info program-spaces

     

    四、调试fork

      默认情况下,当一个程序fork,gdb会跟踪父进程而子进程畅通无止的执行。如果在child中设置了一个断点,执行到断点处,child会收到一个SIGTRAP信号,默认为终止程序。

      最开始调试child进程的方法是在child中设置一个sleep,然后通过attach连到child。

    set follow-fork-mode mode

    show follow-fork-mode:

      在Linux2.5.46以后,gdb支持fork函数的调试;通过set-follow-mode命令,设置跟随parent还是child,如果不设置默认为跟随parent。

    set detach-on-fork mode

    show detach-on-fork:

      在Linux,可以通过set detach-on fork off命令,在fork后,对parent和child都进行调试。父、子进程为多个inferiors,参见第三部分。

     

    五、多线程调试

    info threads:

      显示线程信息。

    thread thread-id

      切换到对应线程。

    thread name [name]:

      修改当前thread的名称。默认为程序名称。

     

    六、Checkpoint

      在Linux,gdb支持保留程序在某个时候的快照,除了进程号和已经输出的内容,所有状态恢复到快照状态。

      通过以下命令实现快照。

      checkpoing: 生成当前状态的快照

      info checkpoint:显示快照信息

      restart checkpoint-id:恢复到某个checkpoint

      delete checkpoint checkpoint-id:删除某个checkpoint

  • 相关阅读:
    zookeeper3.5.6单机集群环境搭建
    mycat分表
    myacat分片及全局表定义
    装饰器
    函数参数,作用域
    可变,不可变,无序, 有序
    dict
    列表可变,元祖不可变
    列表操作
    字符串find
  • 原文地址:https://www.cnblogs.com/dirge/p/10575822.html
Copyright © 2011-2022 走看看