gdb可以查询执行文件的宏, 但是查询不了o文件的宏-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

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源代码了, 这种突如其来的领域问题真是难搞

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章
最新文章
相关文章