Tengo un ligero problema con algunas estructuras en un módulo kernel que estoy construyendo, así que pensé que sería bueno si hubiera una forma fácil de imprimir las estructuras y sus valores, y debajo hay un pequeño ejemplo de lo que es Quiero decir.Linux C: volcado fácil/'bonito'/impresión de estructuras (como en gdb) - ¿del código fuente?
Digamos que tenemos el simple ejemplo C de la siguiente manera (dado en forma de un comando de 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
Si corremos este ejemplo, el programa se compile y BGF ejecutar y parará automáticamente en el punto de interrupción. Aquí podemos hacer lo siguiente:
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
Como se muestra, en GDB podemos salidas impresas (volcar?) El valor del puntero estructura johndoe
como {age = 6, height = 0}
... me gustaría hacer lo mismo , pero directamente desde un programa C; dicen como en el siguiente ejemplo:
#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);
}
cual daría lugar a una salida como:
Hello World - age: 6
$2 = {age = 6, height = 0}
Así que mi pregunta es - lo hace en función de esa imaginaria printout_struct
existen - o hay otro enfoque para hacer una impresión como esta posible?
Gracias de antemano por cualquier ayuda,
¡Salud!
No te disculpes por contestar tus propias preguntas, eso se fomenta aquí. – dmckee
self-answering está bien en SO; en este caso, diría que sería mejor si intentas actualizar esta respuesta para hacernos saber si la solución está bien incluso en los módulos kernel. – ShinTakezou
OK muchachos, gracias por eso; Me acabo de dar cuenta de la pregunta "¿Estás seguro de que quieres responder a tu pregunta?" Cuando estaba intentando publicarlo :) Además, agregué una edición de por qué creo que los módulos del kernel no funcionarán. – sdaau