C语言 使用userfaultfd跟踪对内存的访问

tquggr8v  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(131)

我正在寻找的方法,这将使我能够跟踪用户空间访问虚拟内存。我的基本要求是
1.能够分辨一次访问是读还是写。
1.能够反复地这样做,即。这些是该时间段的访问,重置保护/跟踪机制并再次跟踪所有访问。
现在我使用的是PROT_NONE+SIGSEGV技巧。当有一个访问时,会产生一个分段故障信号,我会捕获并处理。处理程序将判断它是写还是读,并删除保护。当时机成熟的时候,我会重新应用保护并重新开始追踪。
问题是,有时候其他库出于自己的目的,会用自己的函数替换SIGSEGV处理程序,所以会发生糟糕的事情。
最近,我偶然发现了userfaultfd机制,似乎很有前途。据我所知,它基本上可以检测到两件事(除其他外当然):
a.撰写
B.访问尚未分配的页面,但在这种情况下,您可以判断它是读还是写。
因此,您可以跟踪写入,但对于读取,您只能知道是否发生在操作系统尚未分配的页面上。一旦它被分配,您只能跟踪写入。
我的理解是否正确?
所以据我所知,这基本上不会让我满足我的第二个要求。我正在想办法解决这个问题,但它们不会是免费的,所以我想确保我没有错过一些重要的东西。

s2j5cfk0

s2j5cfk01#

userfaultfd并不适合您的用例,如果您想在程序运行时跟踪访问,您可以使用PEBS等采样机制并使用MEM_INST_RETIRED.ANY计数器。或者,您可以使用像PIN这样的工具来检测正在运行的应用程序的每次内存访问(加载或存储)。如果你提到你正在做的事情背后的原因是什么,如果你需要真实的了解访问以做出内存管理决策,这将是非常有用的,这比你需要离线跟踪访问(PIN提供)要复杂得多。

相关问题