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

时间: 2024-12-28 16:00:24

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

高性能的MySQL(6)查询执行机制(一)

希望优化查询性能的时候,最好的办法是弄清楚MySQL是如何优化和执行查询的.了解了内部机制,才能更好的实施设计. 当MySQL执行一个查询时,到底做了什么,先看一副图吧: 1.客户端发送一条查询给服务器. 2.服务器先检查查询缓存,如果命中了缓存,则立刻返回缓存中的结果,否则进入下一步. 3.服务器端进行SQL解析.预处理.再由优化器生成对应的执行计划. 4.MySQL根据优化器生成的执行执行计划,调用存储引擎的API来进行查询. 5.将结果返回给客户端 上面的每一步都很复杂,特别是查询优化器这

T-sql语句查询执行顺序

原文:T-sql语句查询执行顺序 前言 数据库的查询执行,毋庸置疑是程序员必备技能之一,然而数据库查询执行的过程绚烂多彩,却是很少被人了解,今天哥哥要带你装逼带你飞,深入一下这sql查询的来龙去脉,为查询的性能优化处理打个基础,或许面试你也会遇到,预防不跪还是看看吧. 这篇博客,摒弃查询优化性能,作为其基础,只针对查询流程讲解剖析. 本片博客阐述的过程为 1.上一个标识过的sql语句,展示查询执行的流程 2.上一个流程图 3.做一个例子逐步深入分析,帮助理解 4.做一个装逼的总结 sql查询语句

LINQ 的查询执行何时是延迟执行,何时是立即执行,以及查询的复用

问题描述 延迟执行的经典例子:我们用select++i就可以看到在foreach时候,查询才被执行.publicstaticvoidLinq99(){int[]numbers=newint[]{5,4,1,3,9,8,6,7,2,0};inti=0;varq=fromninnumbersselect++i;foreach(varvinq)Console.WriteLine("v={0},i={1}",v,i);}输出结果:v=1,i=1v=2,i=2v=3,i=3v=4,i=4v=5,

一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法

之前的几篇文章: <一个执行计划异常变更的案例 - 前传> <一个执行计划异常变更的案例 - 外传之绑定变量窥探> <一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法> <一个执行计划异常变更的案例 - 外传之rolling invalidation> <一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)> 本篇外传主要介绍一些常用的执行计划查看方法. SQL的执行计划实际代表了目标SQL在Orac

postgresql java问题-Postgresql java编程用jdbc连接,怎么样执行postgresql中 d 的查询指令

问题描述 Postgresql java编程用jdbc连接,怎么样执行postgresql中 d 的查询指令 请各位大神帮忙解决一下这个问题:"Postgresql java编程用jdbc连接,怎么样执行postgresql中 d 的查询指令"谢谢. 情况是这样: 我要把所有表的constraints的column找出来,但是我只能通过pg_indexes找到constraints的名字,只有通过d constraints_name 才能找到column,所有请教各位大神有没有解决方法

《MySQL DBA修炼之道》——1.3 查询执行过程概述

1.3 查询执行过程概述 图1-2抽象化地描述了客户端和数据库交互的过程. 图1-2 客户端与数据库交互抽象架构图 如图1-2所示,客户端(Clients)发布查询的流程如下,首先连接MySQL(Connection Handling),然后发布查询,如果缓存(Query Cache)中有结果集,则直接返回结果集.如果结果没有被缓存,那么,MySQL解析查询(Parser)将通过优化器(Optimizer)生成执行计划,然后运行执行计划通过API(Pluggable Storage Engine

Oracle Application Server PL/SQL 未授权的 SQL 查询执行。

问题描述 Oracle Application Server PL/SQL 未授权的 SQL 查询执行. AppScan漏洞扫描,Oracle Application Server PL/SQL 未授权的 SQL 查询执行.这样的漏洞怎么解决呢. 解决方案 你这个问题是不是没有给SQL授权.http://kb.cnblogs.com/page/100144/ 这个链接你点击进去看看对你有没有帮助.

浅析SQL Server的聚焦使用索引和查询执行计划_MsSql

前言 上一篇<浅析SQL Server 聚焦索引对非聚集索引的影响>我们讲了聚集索引对非聚集索引的影响,对数据库一直在强调的性能优化,所以这一节我们统筹讲讲利用索引来看看查询执行计划是怎样的,简短的内容,深入的理解. 透过索引来看查询执行计划 我们首先来看看第一个例子 1.默认使用索引 USE TSQL2012 GO SELECT orderid FROM Sales.Orders SELECT * FROM Sales.Orders 上述我们看到第2个查询的所需要的开销是第1个查询开销的3倍

加密的excel文件,如何防止用户多次输入密码,用“宏”能不能限制尝试的次数?或者加上判断

问题描述 加密的excel文件,如何防止用户多次输入密码,用"宏"能不能限制尝试的次数?或者加上判断 加密的excel文件,如何防止用户多次输入密码,用"宏"能不能限制尝试的次数?或者加上判断 解决方案 http://jingyan.baidu.com/article/9158e00064ebd6a25512285f.html