• GDB符号表概念及Linux获取符号表的方式


    GDB符号表概念

    GDB符号表是GDB调试器在调试过程中使用的一种数据结构,它包含了程序中函数、变量、类型等信息,方便在GDB在调试过程中进行符号解析和地址定位。

    GDB符号表主要由以下几部分组成:

    1. 函数符号表:包含了程序中定义的函数名称、参数、返回值等信息。
    2. 变量符号表:包含了程序中定义的变量名称、类型、作用域等信息。
    3. 类型符号表:包含了程序中定义的数据类型,例如结构体、枚举、类型别名等。
    4. 地址映射表:将程序中的虚拟地址映射到物理地址,方便GDB在调试过程中进行地址定位。

    GDB符号表是在编译时生成的,通常由编译器在生成目标文件时自动生成。在调试过程中,GDB会读取符号表,将程序中的地址解析为符号名称,以便在调试过程中进行源代码定位和变量查看。同时,GDB也可以根据符号表对程序进行反向映射,例如查看某个函数或变量的调用栈、内存占用情况等。

    需要注意的是,GDB符号表并不是在所有情况下都能够完全准确地反映程序的实际情况。例如,在某些优化情况下,编译器可能会对代码进行优化,导致GDB调试过程中无法准确定位某些符号。此外,如果程序使用了第三方库或插件,也可能导致GDB无法正确解析符号。因此,在调试过程中,如果发现GDB符号表不准确或不完整,需要检查编译器选项和程序以来关系,以确保调试的准确性。

    Linux获取符号表调试

    我们在利用GDB调试时通常需要符号表才可以方便地打断点、查看详细变量、位置信息。

    • 为了获取对可执行文件/动态库的符号表,我们在编译时必须加上-g参数生成对应的符号信息。

      gcc -g test.c -o test
      
      • 1

      这样在编译过程中将调试信息嵌入到生成的二进制文件中。

    • 获取程序的二进制文件和符号表文件:执行以下命令来获取程序的二进制文件和符号表文件:

      objcopy -O binary test test.bin
      addr2line -e test.bin -f -s -n 1>test.sym
      
      • 1
      • 2

      这将生成名为test.bin的二进制文件和名为test.sym的符号表文件。

    • 获取GDB符号表:使用GDB调试器打开二进制文件获取符号表。执行以下命令:

      gdb test.bin
      (gdb) list(address)
      
      • 1
      • 2

      将address替换成需要查看的函数或者变量的地址。GDB将显示该地址处的函数或变量的源代码和符号表信息。

  • 相关阅读:
    JavaScript学习之路---js基础(基本语法,认识js)
    在React中传递onFocus事件的参数
    Qt源码阅读(四) 事件循环
    flink集群与资源@k8s源码分析-资源II 资源提供
    各种类型的API接口,应有尽有
    【UE4笔记】paper2D通过静态图片创建动画序列
    论文阅读-基于低秩分解的网络异常检测综述
    自动化测试的生命周期是什么?
    win10解决你当前无权访问该文件夹,拒绝你访问该文件夹
    技术停滞:如何更新?
  • 原文地址:https://blog.csdn.net/weixin_52018852/article/details/134422947