Приложение создает основной файл.
Вот основная информация.
Был получен стек ошибок, и цель состоит в том, чтобы проверить содержимое данных в переменной 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 беззнаковых целых числа и 1 целое число), которые я рассматривал как эти из вывода:
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@"
p (char *)0x01938640
, и тогда вы увидите его как строку. 14.02.2020p *((otherStruct*)myStruct->f)
14.02.2020