Просто хотел сказать - спасибо за все ваши хорошие и невероятно быстрые ответы, очень помог мне понять проблему (почему в C нет такой «нативной» функции)!
( и извините за ответ на мой собственный вопрос - я делаю это, чтобы не искажать исходный пост, и не смог отформатировать код )
Пока я смотрю дальше,удалось найти:
, которые иллюстрируют трюк с вызовом gdb
с pid самого процесса, и поэтому я изменил найденную там функцию dumpstack
, чтобы получить следующий код:
FN=mtest
cat > $FN.c <<EOF
#include <stdio.h> //printf
#include <stdlib.h> //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
Хотя я не уверен, что он будет работать с модулями ядра ...
Еще раз спасибо за помощь,Приветствия!
РЕДАКТИРОВАТЬ: причина, почему я не думаю, что это будет работать для модулей ядра, в том, что в этом случае у нас есть программа пользователя с идентификатором процесса;и мы просто вызываем gdb
из этой программы, инструктируя его о нашем PID - так что gdb
может «присоединиться» к нашему процессу;затем, поскольку gdb
также получает указание загрузить исполняемый файл с символами отладки (чтобы он «знал», что такое структура), и проинструктирован об адресе, где находится данная переменная структуры, gdb
может затем распечатать структуру,
Для модулей ядра - во-первых, я не думаю, что они являются «процессами» в смысле наличия уникального PID, поэтому gdb
не будет иметь ничего для присоединения!Фактически, существует отладчик ядра, kgdb , который фактически может взломать работающее ядро и пройти по module source code;однако для этого вам понадобится вторая машина, подключенная через последовательное соединение, или виртуальная машина, см. Linux Hacks: Настройка kgdb с помощью kvm / qemu .
Так что, в любом случае,кажется, что gdb
не сможет проверить память запущенного в данный момент ядра хоста, в котором работает gdb
- но я попытаюсь поэкспериментировать, и если эксперименты покажут иначе, я обязательно напишу :)