Включение mprotect не возвращает в нормальное состояние?

Я пытаюсь создать программу для отслеживания памяти процесса ..
В какой-то момент я пытаюсь защитить всю память, используя мою функцию защиты:

static void Protect(void* ptr, size_t size)
{
MemoryMgr& mgr = MemoryMgr::instance();
assert(!(size%s_pageAlign));
assert(ptr == (void*)((unsigned long long)(ptr)&0xfffffffffffff000));

printf("Protecting: 0x%x - 0x%x\n" ,(unsigned long long)(ptr), (unsigned long long)(ptr) + size);
assert(mgr.m_protected.insert(MemoryMgr::Protected_t::value_type(ptr, size)).second);
int r = mprotect(ptr, size, PROT_READ);
if (r) {
perror("mprotect");
cout << "Error: " << r << endl;
cout.flush();
exit(1);
}
s_allocCnt += size / s_pageAlign + ((size%s_pageAlign)? 1 : 0);

}

и затем я зарегистрировал обработчик interuupt, который делает:

static void handler(int sig, siginfo_t *si, void *unused) {
MemoryMgr::OnSegFault(si ->si_addr, sig);
}

int MemoryMgr::OnSegFault(void* addr, int serious) {
MemoryMgr& mgr = instance();
Protected_t::iterator ptr = std::find_if(begin(mgr.m_protected), end(mgr.m_protected), [addr](Protected_t::value_type& ptr) -> bool {
return ((ptr.first <= addr) && (addr < (ptr.first + ptr.second)));
});
if (ptr == mgr.m_protected.end()) {
cout << "Ignoring segfault at Addr: " << (unsigned long long)(addr) << endl;
mprotect((void*)((unsigned long long)(addr)&0xfffffffffffff000), s_pageAlign, PROT_READ | PROT_WRITE);
s_ignoredPageFaults++;
return 1;
}
printf("Segaulting at Ptr : 0x%x - 0x%x\n", (unsigned long long)(ptr ->first), (unsigned long long)(ptr ->first) + ptr ->second);
s_segFaultCnt += ptr ->second/s_pageAlign + ((ptr ->second%s_pageAlign)? 1 : 0);
int r = mprotect(ptr ->first, ptr ->second, PROT_READ | PROT_WRITE);
if (r) {
cout << "Mprotect Failed" << endl;
cout.flush();
return 0;
}
return 1;
}

Кажется, что процесс застрял на определенном fwrite … но я могу видеть в журналах, что память, к которой процесс пытается получить доступ, уже давно изолирована и вернулась в нормальное состояние …
Я также вижу, что процесс не останавливается при первом чтении памяти из этого блока, но после довольно большого количества страниц …
у кого-нибудь есть идеи / подсказки?

Благодарю.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]