我正在编写自己的文章,malloc并使用LD_PRELOAD技巧来使用它。我需要能够对读取和写入的每个内存访问都执行自定义功能(性能不是问题,功能是目标)。
例如,对于一些类似的代码
int x = A[5];
我希望能够捕获读取的内容,(A + 5)而不是从该内存位置读取内容,而是返回我自己的自定义值以存储在中x。
到目前为止,我的想法是:
mprotect离开,处理生成的SIGSEGV,然后在处理程序中执行我需要做的事情。据我所知,我可以访问中的错误地址void *si_addr,但是我不确定如何区分读和写-即使我确实做到了,但我不确定如何处理写操作,因为我不知道要在处理程序中写入的值。 调整gcc以专门处理内存访问。据我了解,了解gcc代码需要花一些时间,除非它的IR /抽象程序可以方便地隔离内存加载/存储,否则我不确定这是多么实用。 任何建议表示赞赏。
最简单的方法是通过malloc(您可能想拥有mmap,munmap,mprotect,sig(action,nal等)...以获得完整的覆盖范围)。您的返回地址与有效的映射不对应,捕获SIGBUS + SIGSEGV,解释siginfo结构以修复您的进程,...但是,这在某种程度上仅限于在堆上进行操作,程序可以很容易地从中进行逃逸,如果如果您尝试捕获行为异常的程序,则该程序可能会损坏您的查找表。
为了获得更全面的介绍,您可能需要看看gvisor,它被标为容器运行时沙箱。它的技术更接近调试器,因为它可以完全控制目标,捕获其故障,系统调用等,并管理其地址空间。为适应您的需求,可能需要进行少量手术。
在任何一种情况下,发生故障时,都必须安装内存并重新启动程序或模仿指令。如果您要处理的是像riscv或ARM这样的干净体系结构,那么仿真并不是太糟糕,但是对于像x86这样的过度狂热的体系结构,您几乎需要集成qemu。如果采用类似gvisor的方法,则可以安装页面并设置单步标记,然后在单步陷阱上删除该页面,这样就不那么麻烦了。dtrace的前身叫atrace,它使用这种方法来分析缓存和tlb访问模式。
听起来像是一个有趣的项目;我希望这会顺利。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。