Я пишу инструмент трассировки, который должен иметь дело с выводом JIT, поэтому иногда стек может выглядеть довольно странно. Я хотел бы попробовать применить эвристику к адресам, чтобы определить, являются ли они кодом, данными или мусором. (Если иногда я ошибаюсь, в этом нет ничего страшного; однако, если процесс выйдет из строя, не так уж и много.)
Я могу cat /proc/«pid»/maps получить список сопоставлений виртуальных машин для процесса в Linux. Можно ли получить доступ к этой информации (или любому ее подмножеству) изнутри процесса без анализа этого файла? Было бы идеально проверить биты rwx для адреса. По сути, мне нужна «читаемая» версия mprotect(2).
Если я не могу этого сделать, как насчет определения того, вызовет ли доступ к определенному адресу ошибку сегментации? (В этом случае уже установлен обработчик SIGSEGV, и я не могу легко его перезаписать, иначе я бы просто сделал это.)





Просматривая все функции, связанные с памятью, я обнаружил, что могу использовать munlock(), чтобы определить, действительна ли страница.
bool is_address_valid(ADDRINT addr) {
static int pagesize = getpagesize();
const void *foo = (const void *)(addr / pagesize * pagesize);
if (munlock(foo, 1) == -1) {
fprintf(stderr, "munlock(%p=>%p, 1) failed: %s\n", addr, foo,
strerror(errno));
return false;
}
return true;
}
Довольно отвратительно, но это предотвращает сбой моего кода.