gdb喜欢打印结构的指针

时间:2012-11-06 18:20:13

标签: c linux systems-programming

我需要一种方法让gdb像输出一样指向一个显示所有字段及其地址和相应值的结构。是否有一种干净的方法来执行此操作,而不是按成员打印成员。我不能使用任何其他外部工具,如pstruct或libgdb。我想从我们的C程序中做到这一点。我在系统上有gdb并且可以使用它。谢谢你的时间。

4 个答案:

答案 0 :(得分:2)

您的选择是:

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

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

c)按会员打印会员。

答案 1 :(得分:1)

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

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

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

}

如果你想要它是通用的,那么传递一个接收空指针并适当地投射它。

答案 2 :(得分:1)

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

libdwarf可能会帮助你。

dwarf(和stabs / stabs +)的规格在网上有关,但这是从头开始的大量工作。

答案 3 :(得分: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);
}