zoukankan      html  css  js  c++  java
  • gdb 调试利器

    1. gdb 调试利器

    GDB是一个由GNU开源组织公布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。对于一名Linux下工作的c++程序猿,gdb是不可缺少的工具;

    1.1. 启动gdb

    对C/C++程序的调试。须要在编译前就加上-g选项:

    $g++ -g hello.cpp -o hello
    

    调试可运行文件:

    $gdb <program>
    

    program也就是你的运行文件。一般在当前文件夹下。

    调试core文件(core是程序非法运行后core dump后产生的文件):

    $gdb <program> <core dump file>
    $gdb program core.11127
    

    调试服务程序:

    $gdb <program> <PID>
    $gdb hello 11127
    

    假设你的程序是一个服务程序,那么你能够指定这个服务程序执行时的进程ID。

    gdb会自己主动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

    1.2. gdb交互命令

    启动gdb后,进入到交互模式,通过下面命令完毕对程序的调试。注意高频使用的命令一般都会有缩写,熟练使用这些缩写命令能提高调试的效率;

    执行

    • run:简记为 r 。其作用是执行程序,当遇到断点后,程序会在断点处停止执行,等待用户输入下一步的命令。

    • continue (简写c ):继续执行,到下一个断点处(或执行结束)
    • next:(简写 n),单步跟踪程序。当遇到函数调用时,也不进入此函数体。此命令同 step 的主要差别是,step 遇到用户自己定义的函数,将步进到函数中去执行,而 next 则直接调用函数,不会进入到函数体内。
    • step (简写s):单步调试假设有函数调用。则进入函数;与命令n不同,n是不进入调用的函数的
    • until:当你厌倦了在一个循环体内单步跟踪时。这个命令能够执行程序直到退出循环体。

    • until+行号: 执行至某行,不只用来跳出循环
    • finish: 执行程序,直到当前函数完毕返回,并打印函数返回时的堆栈地址和返回值及參数值等信息。

    • call 函数(參数):调用程序中可见的函数。并传递“參数”,如:call gdb_test(55)
    • quit:简记为 q ,退出gdb

    设置断点

    • break n (简写b n):在第n行处设置断点

      (能够带上代码路径和代码名称: b OAGUPDATE.cpp:578)

    • b fn1 if a>b:条件断点设置

    • break func(break缩写为b):在函数func()的入口处设置断点。如:break cb_button

    • delete 断点号n:删除第n个断点

    • disable 断点号n:暂停第n个断点

    • enable 断点号n:开启第n个断点

    • clear 行号n:清除第n行的断点

    • info b (info breakpoints) :显示当前程序的断点设置情况

    • delete breakpoints:清除全部断点:

    查看源码

    • list :简记为 l ,其作用就是列出程序的源码,默认每次显示10行。

    • list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
    • list 函数名:将显示“函数名”所在函数的源码。如:list main
    • list :不带參数,将接着上一次 list 命令的,输出下边的内容。

    打印表达式

    • print 表达式:简记为 p 。当中“表达式”能够是不论什么当前正在被測试程序的有效表达式,比方当前正在调试C语言的程序。那么“表达式”能够是不论什么C语言的有效表达式,包含数字。变量甚至是函数调用。
    • print a:将显示整数 a 的值
    • print ++a:将把 a 中的值加1,并显示出来
    • print name:将显示字符串 name 的值
    • print gdb_test(22):将以整数22作为參数调用 gdb_test() 函数
    • print gdb_test(a):将以变量 a 作为參数调用 gdb_test() 函数
    • display 表达式:在单步执行时将很实用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a
    • watch 表达式:设置一个监视点。一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。

      如: watch a

    • whatis :查询变量或函数
    • info function: 查询函数
    • 扩展info locals: 显示当前堆栈页的全部变量

    查询执行信息

    • where/bt :当前执行的堆栈列表;
    • bt backtrace 显示当前调用堆栈
    • up/down 改变堆栈显示的深度
    • set args 參数:指定执行时的參数
    • show args:查看设置好的參数
    • info program: 来查看程序的是否在执行,进程号,被暂停的原因。

    切割窗体

    • layout:用于切割窗体。能够一边查看代码,一边測试:
    • layout src:显示源码窗体
    • layout asm:显示反汇编窗体
    • layout regs:显示源码/反汇编和CPU寄存器窗体
    • layout split:显示源码和反汇编窗体
    • Ctrl + L:刷新窗体

    注解

    交互模式下直接回车的作用是反复上一指令。对于单步调试很方便。

    1.3. 更强大的工具

    cgdb

    cgdb能够看作gdb的界面增强版,用来替代gdb的 gdb -tui。cgdb主要功能是在调试时进行代码的同步显示,这无疑添加了调试的方便性,提高了调试效率。界面类似vi,符合unix/linux下开发者习惯;假设熟悉gdb和vi,差点儿能够马上使用cgdb。

  • 相关阅读:
    【Azure 应用服务】在Azure App Service多实例的情况下,如何在应用中通过代码获取到实例名(Instance ID)呢?
    【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
    【Azure Developer】使用Azure Key Vault 的Key签名后,离线验证的一些参考资料
    【Azure Function】调试 VS Code Javascript Function本地不能运行,报错 Value cannot be null. (Parameter 'provider')问题
    【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(Xms512m Xmx1204m)?
    【Azure API 管理】APIM添加Logtoeventhub的策略后,一些相关APIM与Event Hub的问题
    【Azure API 管理】为调用APIM的请求启用Trace 调试APIM Policy的利器
    【Azure 事件中心】China Azure上是否有Kafka服务简答
    【Azure 应用服务】探索在Azure上设置禁止任何人访问App Service的默认域名(Default URL)
    【Azure 微服务】记一次错误的更新Service Fabric 证书而引发的集群崩溃而只能重建
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6886105.html
Copyright © 2011-2022 走看看