我正在编写一个需要处理JIT输出的跟踪工具,因此堆栈有时看起来很奇怪。我想尝试将一些启发式方法应用于地址,以确定它们是代码,数据还是垃圾。 (如果我在某些时候错了,那没关系;但是如果这个过程崩溃了,那就不那么重要了。)
我可以cat /proc/«pid»/maps
获取Linux中进程的VM映射列表。是否可以从流程内部访问此信息(或任何子集)而无需解析该文件?检查地址的rwx
位是理想的。基本上,我想要mprotect(2)
的“阅读”版本。
如果我不能这样做,如何确定访问某个地址是否会导致分段错误? (在这种情况下已经安装了SIGSEGV
处理程序,我无法轻易覆盖它,或者我只是这样做。)
答案 0 :(得分:2)
查看我发现的所有与内存相关的函数,我可以使用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;
}
非常恶心,但确实会阻止我的代码崩溃。