Я пишу 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