Приложение генерирует основной файл.
Вот основная информация.
Получен стек ошибок, и цель состоит в том, чтобы проверить содержимое данных в переменной myStruct, поскольку именно это передается в myFunction при возникновении ядра.
(gdb) where
#0 0x000000000041bba1 in myFunction (myStruct=0x7ffff9dd0c20) at myTest.c:344
:
:
:
Исходя из вышеизложенного, я получил адрес myStruct по адресу 0x7ffff9dd0c20 и выгрузил 200 слов.
(gdb) x/200x 0x7ffff9dd0c20
0x7ffff9dd0c20: 0x01938640 0x00000000 0x00001c34 0x000002c8
0x7ffff9dd0c30: 0x00000400 0x00000000 0x01939760 0x00000000
0x7ffff9dd0c40: 0x00000014 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c50: 0x00000000 0x0005000c 0x00000000 0x000d0000
0x7ffff9dd0c60: 0x00000004 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c70: 0x00000000 0x00000000 0x00040000 0x00000000
0x7ffff9dd0c80: 0x0001000c 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c90: 0x00000000 0x00000000 0x00000009 0x00000000
0x7ffff9dd0ca0: 0x00000000 0x00000000 0x410d999a 0x418d999a
0x7ffff9dd0cb0: 0x40b80000 0x41380000 0x000010cc 0x00000000
0x7ffff9dd0cc0: 0x0192edd0 0x00000000 0x00000a30 0x00000158
:
:
:
Теперь я хочу убедиться, что я правильно читаю вывод данных.
Вот информация о структуре.
typedef struct
{
char *a;
unsigned int b;
unsigned int c;
int d;
} structA;
typedef struct
{
structA e;
char *f;
} myStruct; <----------This is what gets passed in and what I am trying to examine.
Работает на Linux была запущена программа для проверки размера типа данных.
Size of char* : 8
Size of int : 4
Зная адрес 0x7ffff9dd0c20 и структуру myStruct, я предполагаю, что начну с анализа structA, поскольку он первый.
Поскольку char * a - это первая часть structA, а char * - это 2 слова, я посмотрю на это:
0x01938640 0x00000000
Далее, по сути, 3 целых (2 без знака int и 1 int), который я рассматривал из вывода:
0x00001c34
0x000002c8
0x00000400
Это возвращает меня в structB и к атрибуту char * f, который должен состоять из 2 слов.
Это означает, что это правильный адрес :
0x00000000 0x01939760
Я снова скопировал информацию о памяти, чтобы было легче ссылаться на нее.
(gdb) x/200x 0x7ffff9dd0c20
0x7ffff9dd0c20: 0x01938640 0x00000000 0x00001c34 0x000002c8
0x7ffff9dd0c30: 0x00000400 0x00000000 0x01939760 0x00000000
0x7ffff9dd0c40: 0x00000014 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c50: 0x00000000 0x0005000c 0x00000000 0x000d0000
0x7ffff9dd0c60: 0x00000004 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c70: 0x00000000 0x00000000 0x00040000 0x00000000
0x7ffff9dd0c80: 0x0001000c 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c90: 0x00000000 0x00000000 0x00000009 0x00000000
0x7ffff9dd0ca0: 0x00000000 0x00000000 0x410d999a 0x418d999a
0x7ffff9dd0cb0: 0x40b80000 0x41380000 0x000010cc 0x00000000
0x7ffff9dd0cc0: 0x0192edd0 0x00000000 0x00000a30 0x00000158
Это правильный способ проверки и анализа данных?
Вот определение еще одной структуры.
typedef struct
{
short w;
unsigned long x;
short y;
short z;
} otherStruct;
Это то, что, как ожидается, будет сохранено в f.
char *f;
В GDB я попытался сделать следующее:
p (otherStruct *)0x1939760
и он печатает:
$12 = (otherStruct *) 0x1939760
Странная часть, когда я первоначально распечатал данные, это показало * f как следующее, что не похоже на структуру:
f = 0x1939760 "\315\314\274@"