zoukankan      html  css  js  c++  java
  • linux中gdb的使用

    断点

      在代码的指定位置中断,使程序在此中断。

    • break <function>    在进入指定函数时停住
    • break <linenum>    在指定行号停住。
    • break +/-offset    在当前行号的前面或后面的offset行停住。offiset为自然数。
    • break filename:linenum    在源文件filename的linenum行处停住。
    • break ... if <condition>    ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。

      案例:

    (gdb) break sc_smartcontract_handler.cpp:45
    Breakpoint 4 at 0x424d42: file sc_smartcontract_handler.cpp, line 45.
    

      对断点的相关操作

    • delete    删除所有断点
    • delete breakpoint [n]    删除某个断点
    • disable breakpoint [n]    禁用某个断点
    • enable breakpoint [n]    使能某个断点
    • info breakpoints  [n] 查看当前断点信息

    观察点

       捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。

       捕捉点的命令格式是:catch <event>,event可以是下面的内容

    • watch <expr>    变量发生变化时中断
    • rwatch <expr>    变量被读时中断
    • awatch <expr>     变量值被读或被写时中断

     可以通过info watchpoints [n]命令查看当前观察点信息

    查看变量

     最常用的查看变量的方法是

      (gdb) print {变量名}

    (gdb) print argc
    $1 = 1
    

     如果打印数组,由于默认的设置,可能打印的数组尾部部分没有显示,可以通过如下的命令设置打印数组的最大长度

      (gdb) set print elements 300

    调试中查看代码

    • list function   如list main:显示main函数附近的代码
    • list file:function   如list main.c:main:显示main.c中的main函数附近的代码
    • list n1,n2   如list 10,20,显示当前文件的10到20行

    虽然list已经很方便了, 但还是不尽人意. 如果能够在运行的同时显示代码就好了, 答案是肯定的.

    使用如下命令启动gdb: gdb -tui 项目名 或者在启动gdb后, 输入命令focus,如图:

    恢复程序运行和单步调试

    在gdb中,和调试步进相关的命令主要有如下几条:

    • continue    继续运行程序直到下一个断点(类似于VS里的F5)
    • next        逐过程步进,不会进入子函数(类似VS里的F10)
    • step        逐语句步进,会进入子函数(类似VS里的F11)
    • until        运行至当前语句块结束
    • finish    运行至函数结束并跳出,并打印函数的返回值(类似VS的Shift+F11)

    GDB backtrace bt 查看程序crash堆栈信息

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

    在特定线程中中断

    你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

    • break <linespec> thread <threadno>
    • break <linespec> thread <threadno> if ...

    linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread <threadno>则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如:

         (gdb) break frik.c:13 thread 28 if bartab > lim

    当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。

    其他

    查看当前程序栈的内容: x/10x $sp-->打印stack的前10个元素
    查看当前程序栈的信息: info frame----list general info about the frame
    查看当前程序栈的参数: info args---lists arguments to the function
    查看当前程序栈的局部变量: info locals---list variables stored in the frame
    查看当前寄存器的值:info registers(不包括浮点寄存器) info all-registers(包括浮点寄存器)
    查看当前栈帧中的异常处理器:info catch(exception handlers)

    参考博客

    Linux编程基础——GDB(设置断点)

  • 相关阅读:
    汇编/操作系统 索引帖
    极地网络
    河中跳房子游戏
    搬家大吉QAQQAQ
    【USACO3.1.1】Agri-Net最短网络
    浅谈二叉树
    Android面试经验汇总(二)
    Android面试经验汇总(一)
    Android 聊天室(二)
    Android 聊天室(一)
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/10246658.html
Copyright © 2011-2022 走看看