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(设置断点)

  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/10246658.html
Copyright © 2011-2022 走看看