0

我需要一种方法来获得类似 gdb 的输出,以获取指向显示所有字段及其地址和相应值的结构的指针。有没有一种干净的方法来做到这一点,而不是逐个成员地打印它。我不能使用任何其他外部工具,如 pstruct 或 libgdb。我想在我们的 C 程序中完成它。我的系统上确实有 gdb 并且可以使用它。谢谢你的时间。

4

5 回答 5

2

您的选择是:

a) 从二进制文件中读取调试符号并以与 GDB 相同的方式解释它们以确定结构成员是什么,并将该信息传递给通用打印例程。

b) 手动或使用自定义构建阶段将有关结构的元数据编译到 C 程序中。

c) 逐个打印成员。

于 2012-11-06T18:30:01.353 回答
1

如果您可以链接到第 3 方库并使用适当的调试符号构建您的应用程序(gdb 在这方面非常灵活,但您可能会受到其他方式的限制),您可以尝试从调试符号中提取您需要的信息。

libdwarf可能会帮助你。

dwarf (和 stabs/stabs+)的规格在网上都有,但从头开始需要做很多工作。

于 2012-11-06T18:52:12.380 回答
1

你可以写一个函数来做到这一点?

void printStructPtr( struct name *p)
{
printf("{ ");

//print all members one by one separated by commas
printf("...", p->member1);
printf("...", p->member2);
printf("}");

}

如果你希望它是通用的,那么传递一个接收一个 void 指针并适当地转换它。

于 2012-11-06T18:29:18.013 回答
1

您也许可以自定义 GCC 编译器(例如,使用MELT域特定语言来扩展 GCC)以添加一些新的,这些新__attribute__的将从类型(可能已注释)生成打印代码。但是这样的方法需要几天的工作,我一般不会推荐它,除非你有一个非常大的程序要处理。

请注意,您的问题比您最初想的要复杂:struct可能必须打印和跟踪 a 中的指针(或者如果仅用于管理,则可以省略)。复杂的数据结构具有共享组件,因此您需要管理已访问的数据集。另请注意,打印union-s 通常是不可能的,除非您有一些鉴别器(以及关于它的约定,它们在C声明之外)。

我宁愿使用(或开发)一个工具,它接受您的数据结构的描述(带有附加注释)并为其输出打印例程,以及您的数据的 C 声明。

顺便说一句,您的问题与序列化有关

于 2012-11-07T07:06:31.813 回答
0

如果所有结构成员都相同,则可以增加指向第一个成员的指针以访问结构的其他成员,尽管这通常不是一个好主意,因为有时会填充结构。例如:

struct my_struct{
    int a;
    int b;
    int c;
};

struct my_struct t = {1, 2, 3};
int *p = &t.a;
for (i=0; i<sizeof(t)/sizeof(int); i++, p++) {
    printf("%d\n", *p);
}
于 2012-11-06T18:25:40.360 回答