У меня возникла небольшая проблема с некоторыми структурами в модуле ядра, который я создаю, поэтому я подумал, что было бы неплохо, если бы был простой способ распечатать структуры и их значения. Ниже приведен небольшой пример что я имею в виду.
Скажем, у нас есть простой пример C, как показано ниже (заданный в виде команд bash):
FN=mtest
cat > $FN.c <<EOF
#include <stdio.h> //printf
#include <stdlib.h> //calloc
struct person
{
int age;
int height;
};
static struct person *johndoe;
main ()
{
johndoe = (struct person *)calloc(1, sizeof(struct person));
johndoe->age = 6;
asm("int3"); //breakpoint for gdb
printf("Hello World - age: %d\n", johndoe->age);
free(johndoe);
}
EOF
gcc -g -O0 $FN.c -o $FN
# just a run command for gdb
cat > ./gdbcmds <<EOF
run
EOF
gdb --command=./gdbcmds ./$FN
Если мы запустим этот пример, программа будет компилироваться, а gdb запустит его и автоматически остановится в точке останова. Здесь мы можем сделать следующее:
Program received signal SIGTRAP, Trace/breakpoint trap.
main () at mtest.c:20
20 printf("Hello World - age: %d\n", johndoe->age);
(gdb) p johndoe
$1 = (struct person *) 0x804b008
(gdb) p (struct person)*0x804b008
$2 = {age = 6, height = 0}
(gdb) c
Continuing.
Hello World - age: 6
Program exited with code 0300.
(gdb) q
Как показано, в gdb мы можем распечатать (dump?) значение указателя struct johndoe
как {age = 6, height = 0}
... Я хотел бы сделать то же самое, но непосредственно из программы C; скажем, как в следующем примере:
#include <stdio.h> //printf
#include <stdlib.h> //calloc
#include <whatever.h> //for imaginary printout_struct
struct person
{
int age;
int height;
};
static struct person *johndoe;
static char report[255];
main ()
{
johndoe = (struct person *)calloc(1, sizeof(struct person));
johndoe->age = 6;
printout_struct(johndoe, report); //imaginary command
printf("Hello World - age: %d\nreport: %s", johndoe->age, report);
free(johndoe);
}
который будет иметь результат с выходом:
Hello World - age: 6
$2 = {age = 6, height = 0}
Итак, мой вопрос: существует ли такая функция, как мнимая printout_struct
, или существует ли другой подход, чтобы сделать распечатку такой, как это возможно?
Заранее благодарим за помощь,
Ура!