#c #struct #gdb
#c #структура #gdb
Вопрос:
Учитывая некоторое содержимое памяти (например, из gdb) Я хотел бы восстановить содержимое структуры C. Определяется struct
следующим образом (см. man semop):
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
и содержимое памяти (как указано адресом структуры с использованием отладчика) выглядит следующим образом:
00000000 00 00 ff ff 00 10 78 bd 21 0a 8c c8 24 0a c4 95 |......x.!...$...|
00000010 5e 09 d0 69 22 08 18 78 c9 bf ed f4 28 08 00 00 |^..i"..x....(...|
00000020 00 00 01 00 00 00 01 00 00 00 00 00 00 00 01 00 |................|
Каковы значения sem_num
, sem_op
и sem_flag
? Можно ли с уверенностью предположить, что первая переменная использует один байт, в то время как две другие используют по два байта каждый? Могу ли я затем выполнить только следующее сопоставление?
sem_num = 00
sem_op = 00 ff
sem_flg = ff 00
Комментарии:
1. Зачем
unsigned short
использовать один байт, аshort
использовать два байта?2. Также рассмотрите заполнение структуры и порядковый номер.
3. Вам не нужно обращаться к исходному коду memcpy в структуру. Просто переопределите структуру в своем тестовом коде, создайте массив байтов с правильными байтами, перепишите его, затем посмотрите на значения в структуре. Если вы используете ту же платформу и компилятор, это должно работать хорошо.
4. @Dirk: Вы имеете в виду, что я должен написать по существу однострочный тестовый код на C, скомпилировать и запустить его, и проверить, как в нем выглядит память, а затем перепроектировать содержимое для реального случая?
5. @Alex, я бы немного предположил и сказал
sem_num = 0x0000 (2 bytes), sem_op = 0xffff(ie -1) and sem_flg = 0x0010
. Если вы случайно знаете, какое значение было определено после этого в программе, вы можете проверить последующие значения (0x210a .. ) на соответствие этому.
Ответ №1:
Следуя предложению Dark Falcon, следующий код, похоже, выполняет эту работу:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int
main (void)
{
struct sembuf my_sembuf[1]= {
{0,-1,16*256}
};
unsigned char data[sizeof my_sembuf];
size_t i;
memcpy(data, amp;my_sembuf, sizeof my_sembuf);
for (i=0; i < sizeof my_sembuf; i)
printf("xn", data[i]);
return 0;
}
Включение гарантирует semop
, что структура уже определена, которую необходимо заполнить и сравнить с дампом памяти. Оказывается, содержимое структуры semop должно быть следующим:
unsigned short sem_num = 0;
short sem_op = -1;
short sem_flg = 16*256; /* Corresponding to the flag SEM_UNDO */