我需要一种方法来获得类似 gdb 的输出,以获取指向显示所有字段及其地址和相应值的结构的指针。有没有一种干净的方法来做到这一点,而不是逐个成员地打印它。我不能使用任何其他外部工具,如 pstruct 或 libgdb。我想在我们的 C 程序中完成它。我的系统上确实有 gdb 并且可以使用它。谢谢你的时间。
5 回答
您的选择是:
a) 从二进制文件中读取调试符号并以与 GDB 相同的方式解释它们以确定结构成员是什么,并将该信息传递给通用打印例程。
b) 手动或使用自定义构建阶段将有关结构的元数据编译到 C 程序中。
c) 逐个打印成员。
你可以写一个函数来做到这一点?
void printStructPtr( struct name *p)
{
printf("{ ");
//print all members one by one separated by commas
printf("...", p->member1);
printf("...", p->member2);
printf("}");
}
如果你希望它是通用的,那么传递一个接收一个 void 指针并适当地转换它。
您也许可以自定义 GCC 编译器(例如,使用MELT域特定语言来扩展 GCC)以添加一些新的,这些新__attribute__
的将从类型(可能已注释)生成打印代码。但是这样的方法需要几天的工作,我一般不会推荐它,除非你有一个非常大的程序要处理。
请注意,您的问题比您最初想的要复杂:struct
可能必须打印和跟踪 a 中的指针(或者如果仅用于管理,则可以省略)。复杂的数据结构具有共享组件,因此您需要管理已访问的数据集。另请注意,打印union
-s 通常是不可能的,除非您有一些鉴别器(以及关于它的约定,它们在C声明之外)。
我宁愿使用(或开发)一个工具,它接受您的数据结构的描述(带有附加注释)并为其输出打印例程,以及您的数据的 C 声明。
顺便说一句,您的问题与序列化有关
如果所有结构成员都相同,则可以增加指向第一个成员的指针以访问结构的其他成员,尽管这通常不是一个好主意,因为有时会填充结构。例如:
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);
}