c - gdb - 打印宏名称而不是值
问题描述
是否可以在 gdb 中取消扩展宏?
我已经用 -g3 编译了二进制文件,我可以看到宏定义:
(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)
但是当我看到变量时,我看到的是数值而不是宏名
(gdb) p/x cycle->modules[0]->type
$17 = 0x45524f43
(gdb)
是否有可能得到这样的东西:
(gdb) p cycle->modules[0]->type
$17 = NGX_CORE_MODULE
(gdb)
我试过这样的用户定义函数:
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
它有效
(gdb) expand_module_type_macro cycle->modules[0]->type
$18 = "NGX_CORE_MODULE"
(gdb)
但它没有实际用途,因为我不能将它用于复杂的输出:
(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)
解决方案
通过在 python 中创建一个便利函数,你可能会得到一些有用的东西。我使用这个 C 程序进行了测试:
int var1 = 1234;
int var2 = 4567;
int
main ()
{
return 0;
}
并使用这个 python 脚本:
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 会话:
(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
为了使用带有%s
格式的返回值printf
,我总是返回一个字符串。
推荐阅读
- sql - Postgres 未在 array_agg 查询中返回数据,如下所示
- angular - 从操作表按钮打开模态视图不起作用
- dart - 实例化类和调用可调用类函数的区别
- python - 熊猫数据框 0 成为科学记数法。PL
- python - scikit-learn 中多数投票的训练会重新训练分类器吗?
- python - Kivy MapMarkerPopUp 未显示在 KV 设计文件中
- xamarin.forms - 无法将“TextAlignment.Center”转换为 Xamarin.Forms.TextAlignment
- javascript - 反应 onClick 自动改变孩子的风格
- ios - 启动屏幕图像未出现在 SwiftUI 应用程序中
- java - 如何在 MutableLivedata 中进行更改
- >(从 UI 中删除项目 + 添加新项目)?