обработка SIGSEGV, чтобы узнать размер доступа - PullRequest
1 голос
/ 07 марта 2020

Я пишу c программу для обработки SIGSEGV. Помимо адреса, вызвавшего сигнал, я также хочу узнать размер, программа пыталась получить доступ (16 бит против 32 бит против 64 бит).

Я разобрал коды в GDB и обнаружил, что для другого размера они использовали разные команды сборки, "movb" (uint8), "movw" (uint16), "movl" (uint32) "movq" (uint64), как показано ниже.

В обработчике SIGSEGV есть ли способ определить, сколько бит / байт программа пыталась получить? (предположим, я работаю на x86-64 и linux)

void *buffer;

...

mprotect(buffer, pagesize, PROT_NONE);

uint8 *pu8 = (uint8*)buffer;
pu8[0]=1;  // movb

uint16 *pu16 = (uint16*)buffer;
pu16[0]=1;  // movw

uint32 *pu32 = (uint32*)buffer;
pu32[0]=1;  // movl

uint64 *pu64 = (uint64*)buffer;
pu64[0]=1;  // movq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...