我正在构建的内核模块中的一些结构有一个小问题,所以我认为如果有一种简单的方法可以打印出结构及其值会很好 - 下面是我的意思的一个小的用户空间示例.
假设我们有如下简单的 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 中,我们可以将结构指针的值打印(转储?)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
- 或者是否有另一种方法可以使这样的打印输出成为可能?
提前感谢您的帮助,
干杯!