linux打印输出代码,Linux C:结构的简单且“漂亮”的转储/打印输出(如gdb)-从源代码开始?...

本文档展示了如何使用GDB调试C程序,特别是如何通过GDB获取结构体变量的内容。作者通过创建一个示例程序,演示了如何利用GDB的命令生成并执行调试指令,以打印出结构体的详细信息。尽管这种方法在用户空间程序中有效,但可能不适用于内核模块,因为内核模块的调试通常需要使用kgdb等专门的内核调试工具。
摘要由CSDN通过智能技术生成

小编典典

只是想说-感谢您的所有出色且出奇的快速回答,它帮助我很多理解了这个问题(为什么C中没有这样的“本机”功能)!

( 并且很抱歉回答我自己的问题-这样做是为了避免使原始帖子乱码,并能够设置代码格式 )

该示例说明了使用gdb进程本身的pid进行调用的技巧,因此我修改了dumpstack此处找到的函数,以获取以下代码:

FN=mtest

cat > $FN.c <

#include //printf

#include //calloc, system

extern const char *__progname;

struct person

{

int age;

int height;

};

static struct person *johndoe;

static char report[255];

static void printout_struct(void* invar, char* structname){

/* dumpstack(void) Got this routine from http://www.whitefang.com/unix/faq_toc.html

** Section 6.5. Modified to redirect to file to prevent clutter

*/

/* This needs to be changed... */

char dbx[160];

sprintf(dbx, "echo 'p (struct %s)*%p\n' > gdbcmds", structname, invar );

system(dbx);

sprintf(dbx, "echo 'where\ndetach' | gdb -batch --command=gdbcmds %s %d > struct.dump", __progname, getpid() );

system(dbx);

sprintf(dbx, "cat struct.dump");

system(dbx);

return;

}

main ()

{

johndoe = (struct person *)calloc(1, sizeof(struct person));

johndoe->age = 6;

printout_struct(johndoe, "person");

johndoe->age = 8;

printout_struct(johndoe, "person");

printf("Hello World - age: %d\n:", johndoe->age);

free(johndoe);

}

EOF

gcc -g -O0 $FN.c -o $FN

./$FN

基本上最终显示了我想要的东西:

0x00740422 in __kernel_vsyscall ()

$1 = {age = 6, height = 0}

0x00740422 in __kernel_vsyscall ()

$1 = {age = 8, height = 0}

Hello World - age: 8

不过,我不确定它是否可以与内核模块一起使用…

再次感谢您的帮助,

干杯!

编辑:之所以我认为它不适用于内核模块,是因为在这种情况下,我们有一个带有进程ID的userland程序;并且我们只需gdb从该程序中调用,同时对它的PID进行指示-

这样gdb就可以“附加”到我们的过程中;然后,由于gdb还被指示使用调试符号加载可执行文件(因此它将“知道”该结构是什么),并被指示有关给定结构变量所在的地址,因此gdb可以打印出该结构。

对于内核模块-

首先,我认为它们不是具有唯一PID的“进程”,因此gdb没有任何附加条件!实际上,有一个内核调试器kgdb,它实际上可以分解为正在运行的内核并逐步查看

模块 源代码。但是,您需要第二台通过串行连接连接的计算机-或虚拟机,请参阅Linux Hacks:使用kvm /

qemu设置kgdb。

因此,无论如何,似乎gdb将无法检查正在运行的当前正在运行的主机内核的内存gdb-但我将尝试进行实验,并且如果实验表明其他情况,我将确保发布:)

2020-06-07

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值