首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gdb -打印宏名而不是值

gdb -打印宏名而不是值
EN

Stack Overflow用户
提问于 2019-04-02 16:03:21
回答 1查看 515关注 0票数 2

可以在gdb中使用UNexpand宏吗?

我已经用-g3编译了二进制文件,我可以看到宏定义:

代码语言:javascript
复制
(gdb) info macro  NGX_CORE_MODULE
Defined at /path/src/core/ngx_conf_file.h:70
  included at /path/src/core/ngx_core.h:86
  included at /path/src/core/ngx_cycle.c:9
#define NGX_CORE_MODULE 0x45524F43
(gdb) 

但是当我看到变量时,我看到的是数值而不是宏名

代码语言:javascript
复制
(gdb) p/x cycle->modules[0]->type
$17 = 0x45524f43
(gdb) 

有没有可能得到这样的东西:

代码语言:javascript
复制
(gdb) p cycle->modules[0]->type
$17 = NGX_CORE_MODULE
(gdb) 

我尝试过这样的用户定义函数:

代码语言:javascript
复制
define expand_module_type_macro
if $arg0 == 0x45524F43
   print "NGX_CORE_MODULE"
else 
if $arg0 == 0x464E4F43
   print "NGX_CONF_MODULE"
else
   print $arg0
end
end
end

而且它是有效的

代码语言:javascript
复制
(gdb) expand_module_type_macro cycle->modules[0]->type
$18 = "NGX_CORE_MODULE"
(gdb) 

但它没有实际用途,因为我不能将其用于复杂的输出:

代码语言:javascript
复制
(gdb) printf "module type=%s\n", expand_module_type_macro cycle->modules[0]->type
No symbol "expand_module_type_macro" in current context.
(gdb) set $m = expand_module_type_macro cycle->modules[0]->type
No symbol "expand_module_type_macro" in current context.
(gdb) 
EN

回答 1

Stack Overflow用户

发布于 2019-04-08 20:51:11

通过在python中创建一个方便的函数,您可能会得到一些有用的东西。我使用这个C程序进行了测试:

代码语言:javascript
复制
int var1 = 1234;
int var2 = 4567;

int
main ()
{
  return 0;
}

并使用以下python脚本:

代码语言:javascript
复制
class ExpandMacro (gdb.Function):
    """Expand a value to a string, replacing with
    macro name where possible."""

    def __init__ (self):
        super (ExpandMacro, self).__init__ ("expand")

    def invoke (self, value):
        if (value == 1234):
            return "MY_MACRO"
        else:
            return str (value)

ExpandMacro ()

然后我的GDB会话:

代码语言:javascript
复制
(gdb) start
# .... snip ....
7     return 0;
(gdb) source lookup.py 
(gdb) p $expand (var1)
$1 = "MY_MACRO"
(gdb) p $expand (var2)
$2 = "4567"
(gdb) printf "var1=%s\n", $expand (var1)
var1=MY_MACRO
(gdb) printf "var2=%s\n", $expand (var2)
var2=4567

为了在printf中使用%s格式的返回值,我总是返回一个字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55469723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档