gdb可以查询执行文件的宏, 但是查询不了o文件的宏

简介: 在gcc使用-g3编译的时候, gdb可以查看对应c语言的宏. ``` gdb a.out -ex 'list main' -ex 'info macro XXXX' -ex 'q' Defined at /xvdc/w.c:6 #define XXXX ppppppppppppp ``` 但是o文件却看不了对应的宏, ``` gdb w.o -ex 'list ma

在gcc使用-g3编译的时候, gdb可以查看对应c语言的宏.

gdb a.out -ex 'list main' -ex 'info macro XXXX' -ex 'q'
Defined at /xvdc/w.c:6    #define XXXX ppppppppppppp

但是o文件却看不了对应的宏,

gdb w.o -ex 'list main' -ex 'info macro XXXX' -ex 'q'
The symbol `XXXX' has no definition as a C/C++ preprocessor
<user-defined>:-1

网上找了半天也没发现什么有用的地方, 只能自己看gdb的源代码调

一路调试了半天, 找到了个关键地方
函数dwarf_decode_macros里面解析macinfo_type的时候, a.out和w.o有所区别

      switch (macinfo_type)
        {
          /* A zero macinfo type indicates the end of the macro
             information.  */
        case 0:
      break;

    case DW_MACRO_define:
    case DW_MACRO_undef:
    case DW_MACRO_start_file:
    case DW_MACRO_end_file:

a.out文件的macinfo_type序列是DW_MACRO_import DW_MACRO_start_file
o文件的macinfo_type序列是5个DW_MACRO_define_strp

而在gdb内部产生macro表格的路径是由DW_MACRO_start_file开始的

    case DW_MACRO_start_file:
      {
        unsigned int bytes_read;
        int line, file;

        line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
        mac_ptr += bytes_read;
        file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
        mac_ptr += bytes_read;

        current_file = macro_start_file (file, line, current_file, lh);
      }

下一步要做的就是看看如何让gcc在生产o文件的时候, section .debug_macro里面带上DW_MACRO_start_file

看遍gcc选项也没发现什么, 难道又要去看gcc源代码了, 这种突如其来的领域问题真是难搞

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
NoSQL Linux
gdb调试产生code文件以及遇到的“file format not recognized”问题解决
gdb调试产生code文件以及遇到的“file format not recognized”问题解决
1001 0
|
NoSQL Linux 编译器
Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件
交叉编译gdb和gdbserver 1、下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本。当然,凡事无绝对。我们以gdb-7.2.tar.bz2 这个文件为例。
6660 1
|
4月前
|
NoSQL Linux Windows
geopandas直接支持gdb文件写出与追加
geopandas直接支持gdb文件写出与追加
|
4月前
|
NoSQL 数据挖掘 定位技术
如何让geopandas支持写出gdb文件
如何让geopandas支持写出gdb文件
|
6月前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件
|
NoSQL Docker 容器
core 文件与gdb 调试
core 文件与gdb 调试
47 0
|
存储 人工智能 运维
悦数图数据库v3.5.0发布:查询性能大幅提升,为智能决策和 AI 大模型应用提速
近日,悦数图数据库最新版本(v3.5.0)正式发布,进一步强化数据库内核的查询性能和稳定性,同时全面升级了自带的可视化探索和运维管理工具「悦数图探索」和「悦数运维监控」,全面提升用户体验。
悦数图数据库v3.5.0发布:查询性能大幅提升,为智能决策和 AI 大模型应用提速
|
Kubernetes NoSQL 机器人
gdb调试内核dump文件
容器中node ssr程序生成core文件,使用gdb进行调试
190 0
|
NoSQL Unix Linux
Linux下gdb调试生成core文件并调试core文件
Linux下gdb调试生成core文件并调试core文件
2095 1
Linux下gdb调试生成core文件并调试core文件
|
存储 NoSQL C#
基于C#的ArcEngine二次开发44: GDB矢量文件检查结果导出GDB/SHP的思路分析
基于C#的ArcEngine二次开发44: GDB矢量文件检查结果导出GDB/SHP的思路分析