有谁知道如何获取导致页面错误的内存访问(指针)?我主要对主要页面错误感兴趣。

关于我要实现的目标的一些背景知识。我有一个具有大内存占用的应用程序(数据库),并且我想将分页与对大型数据结构(例如表,使用mmap()分配的索引)的访问相关联。该过程的映射很容易从/proc//maps中检索。现在,如果我具有导致页面错误的内存访问,则可以跟踪访问每个数据结构时导致多少页面错误。

我认为perf或systemtap可以胜任。有任何想法吗?

最佳答案

查看探测点可用的内容:

% stap -L vm.pagefault
vm.pagefault name:string write_access:long address:long $mm:struct mm_struct* \
   $vma:struct vm_area_struct* $address:long unsigned int $flags:unsigned int

记录,尝试将地址映射到符号名称
# stap -e 'probe vm.pagefault { if (execname()=="foo") { printf("%p (%s)\n", address, usymdata(address)) } }' -d /bin/foo --ldd

另请参阅:http://sourceware.org/systemtap/examples/#memory/pfaults.stp

10-04 20:58