GDB那些事之《gdb internal》读书笔记

GDB那些事之《gdb internal》读书笔记

  1. 第二章 整体结构
    • GDB总体上分为三个部分
      用户接口(user interface),主要是一些用户可以使用的命令,说明之类
      符号处理(symbol handling),主要是各种object文件读取,源代码语言的parse、类型判断,调试信息的解释,符号表的管理等
      目标系统处理(target system handling),主要是控制逻辑,程序运行stack frame的分析,真实运行的目标系统的管理操作(比如remote到嵌入式设备)

      这里注意,因为host和target很有可能不是一种architecture, gdb需要在这两者之间进行通信,做必要的转换。这也带来了一些不变及限制。

    • Frame
      用来记录所有函数的调用关系
      GDB中使用create_new_frame, 相应的代码时frame.c

    • 软件断点和硬件断点(Breakpoint)
      硬件断点需要不同的chip的支持,如果遇到需要查询相应的硬件手册及gdb对其的支持(从来没有遇见过,这里可耻的skip,留待以后有缘再补上)

      软件断点,GDB通过在用户设置的断点处,保存现场,并插入trap(能够出发exception的指令),从而中断程序执行,再根据用户的指令来进行之后的动作,如果用户选择继续,则恢复现场,继续执行相应指令

      相应的代码是:breakpoint.c, infrun.c

    • Watchpoints
      它是特俗的断点:断点在执行到对应的语句时被出发,而watchpoints在对应的data被访问时触发。
      用它来发现操作某些数据的指令及语句是很常用的一个手段!
      它同样分为hardware及software,这些都受相应的体系结构所影响
      GDB默认尝试使用hardware的支持

      注意:这里我简单查了一下,arm上面通常使用jtag来完成相应的调试工作,最新的cotex系列支持hardware breakpoint及hardware watchpoint(因为gdb software的相应行为相当的慢,它会一直不停的step来判断你所要求的条件)。
      这个讨论对大家了解相关的场景有帮助:http://www.btsmth.com/show_topic.php?en_name=LinuxDev&gid=261054
      GDB的代码中提供了很多宏来控制检测相应的hardware/software支持及功能。

      GDB对流行的x86体系支持相当好,同时支持hardware/software的watchpoints, 参见3.8.1 x86 Watchpoints, 其中明确描述了x86中是如何实现的(使用哪几个寄存器等等)



  2. 第四章, 用户接口
    GDB提供了各种用户接口,当然,支持最好的还是command line
    • 使用add_cmd, add_setshow_cmd,add_setshow_cmd_full等可以为gdb增加新的命令。
    • 提供了ui_out的接口,用来抽象GDB的输出结果及UI的表示分开。它所使用的方法可以被推广到其它的类似场景,所以值得大家学习
      • 定义了三个主要的结构:这样组合方便程序员组合不同的数据,从而友好且灵活的返回给UI使用。
        single item,单个域(field)
        list,一系列能够被identical的域
        tuple, 一些列不能被identical的域
        table,包含了一组tuple,通常会包含一个header来描述之后的tuple

        ui_out_table_begin
            ui_out_table_header
            ...
            ui_out_table_body
                ui_out_tuple_begin
                ui_out_field_*
                ...
             ui_out_tuple_end
             ...
        ui_out_table_end

      • 提供了与上述相应的处理/构造函数
        void ui_out_xxxx_begin()/ui_out_xxxx_header/ui_out_xxxx_end等等函数

      • 当然还提供了一系列帮助函数
        ui_out_field_skip/ui_out_text

      • 以上相应的代码都在gdb/ui-out.c





  3. libgdb
    • 首先明确一下,这里说的libgdb不是各个linux发行版所带的那些gdb相关的package。而是gdb中的一个模块,用以更好的支持GUI及其它的环境
    • 目前分为以下四个模块
      Observer
      Builder
      Event Loop
      Library
    • 文中对其描述很不详细,google了相关资料,也比较贫乏。这里不做深究了。希望有用过及了解过的能提供些相关资料。


  4. Symbol Handling
    • GDB提供了命令和接口从被debug的程序,其它symbol文件,其它的library导入各种symbol。相关代码在symfile.c。强烈依赖于BFD Library
    • 共有三种symbol tables
      Full symbol tables,(symtabs) 全部的信息
      Partial symbol tables,(psymtabs)部分信息,用来指明相应的信息可以在Full symbol tables中的哪里找到。用它可以加速gdb的启动及查找过程。只提供了address、name两种查询方式,通过它们来与symtabs交互,并返回信息给用户
      Minimal symbol tables,(msymtabs)非debug symbol的信息
    • GDB中的各种内部使用的类型
      Fundamental Types(e.g., FT_VOID, FT_BOOLEAN),由gdb所能掌握的各种语言及各种调试信息中map到这些fundamental types
      Type Codes (TYPE_CODE_PTR, TYPE_CODE_ARRAY, ..),通常多个FT_xxxx映射到一个TYPE_CODE_xxxx上
      Builtin Types( builtin_type_void,...),历史原因留下的,正逐渐被废弃
    • 支持的各种文件格式
      a.out
      COFF
      ECOFF
      XCOFF
      PE
      ELF
      SOM
      Other File Formats
      这些有不少都已经是历史了,相应的信息可以在经典的《linker and loader》中找到:)

    • debugging文件格式
      stabs, 最初由a.out引入,在COFF,ELF都依然会存在,由dbxread.c来处理
      Mips debug, 为ECOFF服务,由mdebugread.c来处理
      Dwarf1/Dwarf2, 为ELF服务,由dwarfread.c/dwarf2read.c处理
      如何引入新的debugging file,需要改动BFD的相关处理逻辑及代码,估计只有牛A与牛C之间的人物去接触这样的工作,羡慕啊!!!!


  5. 语言支持
    • 7.1节给出了如何增加新的语言的解析及表示的步骤,依然是牛A与牛C之间的人物才会去接触这样的工作
      这里可耻的飘过,有机会需要做porting的时候,记住去7.1 Adding a Source Language to GDB去查阅。



  6. Host定义
    这章可以忽略,因为所有host相关的配置都由autoconf来完成,只要参看gdb的相关autoconf的配置文件即可

  7. 目标机器架构定义
    这里定义了GDB所能调试的目标机器的机器语言
    所有目标机器代码都有gdbarch.sh生成对应的gdbarch struct及相应的函数

    所有支持的OS ABI在osabi.h中被定义, 通过一个叫做sniffer的程序来检测一个文件的OS ABI。

    有一些特别的体系结构(如V10T),address和pointer是有区别的,gdb为它们提供了相应的区分函数,但是大部分主流体系结构用不到它们。

    提供了关于address的一个类,用来区分有些特殊的调试环境下的address地址需要不同解释的情况。

    由于不同的体系结构的register内容和memory的内容在存储和表示上会有区别,gdb提供了两者之间转换和表示的宏

    定义了一系列可以被target认识的各种调试方法及命令

    9.11提供了如何支持一个新的target的指导说明


  8. 目标Vector定义
    GDB为了各种不同的target提供了一层抽象的处理系统,来屏蔽各种target通过process或者serials调试时的差异性。
    这章基本没有有用信息,:(((

  9. .....
  10. 附录中的GDB Observers,提供了一个如何用c语言实现observer pattern的真实例子, 值得好好学习
    observer pattern:

你可能感兴趣的:(UI,table,读书,语言,library,debugging)