Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I dump an arbitrary struct in C?

Tags:

c

struct

dump

I don't know which direction to go,perhaps something like reflection will help?

like image 260
new_perl Avatar asked Jul 14 '11 01:07

new_perl


2 Answers

If you're using Clang 8 or newer, you can now use the built-in compiler function __builtin_dump_struct to dump a struct. It uses the information that's naturally available at compile time to generate code that pretty-prints a struct.

Example code demonstrating the function:

dumpstruct.c:

#include <stdio.h>

struct nested {
    int aa;
};

struct dumpme {
    int a;
    int b;
    struct nested n;
};

int main(void) {
    struct nested n;
    n.aa = 12;
    struct dumpme d;
    d.a = 1;
    d.b = 2;
    d.n = n;
    __builtin_dump_struct(&d, &printf);
    return 0;
}

Example compile-and-run:

$ clang dumpstruct.c -o dumpstruct
$ ./dumpstruct 
struct dumpme {
int a : 1
int b : 2
struct nested n : struct nested {
    int aa : 12
    }
}

If you're not using Clang >= 8 but you are using GCC, it's pretty easy to switch. Just install the clang-8 or clang-9 package and replace invocations of gcc with clang.

like image 52
Jonathan Fuerth Avatar answered Oct 10 '22 18:10

Jonathan Fuerth


The answer of @Kerrek SB works realy well, I just post how to use it in a function using a void pointer.

int dump(void *myStruct, long size)
{
    unsigned int i;
    const unsigned char * const px = (unsigned char*)myStruct;
    for (i = 0; i < size; ++i) {
        if( i % (sizeof(int) * 8) == 0){
            printf("\n%08X ", i);
        }
        else if( i % 4 == 0){
            printf(" ");
        }
        printf("%02X", px[i]);
    }

    printf("\n\n");
    return 0;
}

int main(int argc, char const *argv[])
{
    OneStruct data1, data2;

    dump(&data1, sizeof(OneStruct));

    dump(&data2, sizeof(OneStruct));

    return 0;
}
like image 34
Simon Puente Avatar answered Oct 10 '22 17:10

Simon Puente