访问程序中的符号表以打印结构的字段名称

Posted

技术标签:

【中文标题】访问程序中的符号表以打印结构的字段名称【英文标题】:Access symbol table within a program to print field names of a structure 【发布时间】:2016-06-03 10:38:54 【问题描述】:

我想打印结构的所有字段名称(我正在使用 Visual Studio 2012)。

现在,我知道字段名称信息在二进制文件中丢失了,但它在编译时存在。因此,如果以某种方式,我可以访问代码中结构的符号表,那么我应该能够打印字段名称。

用例是结构的定义可能会随着不同的架构而改变,而不是编写依赖于架构的代码,我想直接从符号表中访问字段名称。

编辑:

我感兴趣的结构是“winnt.h”中的“_CONTEXT”。它有多个定义,我想在当前架构上打印定义而不编写依赖于架构的代码。

【问题讨论】:

【参考方案1】:

您不能在 C/C++ 中执行此操作,因为该语言没有 C# 或 Java 中的 反射。您可以编写自己的函数,将名称、类型、大小打印到某个 string 对象中。你可能有一个带有虚函数RenderMembers(或类似)的接口。让所有需要的类/结构都继承并实现它。

MFC RUNTIME_CLASS 有类似的东西。

【讨论】:

那你根本做不到。逆向工程不会很好地工作。如果您尝试逆向工程,字段名称将不正确。 如果您说 EXE 是使用 /DEBUG 标志构建的,并且您拥有 PDB。那是一个不同的故事。真的很难。 如果EXE是用/DEBUG标志构建的,你能告诉我怎么做吗? “所以我无法重新编译任何代码以打印其字段名称..” 现在你说的不是吗? 对不起,我误解了。我可以重新编译我的测试代码。我将删除编辑

以上是关于访问程序中的符号表以打印结构的字段名称的主要内容,如果未能解决你的问题,请参考以下文章

Python:通过字符串中的名称访问结构字段

Go的结构体

access数据库中表中字段前的黄色符号代表啥?

使用变量字段名称访问 UDF

使用 Spark 访问嵌套在结构中的 json 数组

mysql 字段的基本查询