【问题标题】:Tracing memory address for an image loaded into memory on linux在Linux上跟踪加载到内存中的图像的内存地址
【发布时间】:2013-04-05 01:40:30
【问题描述】:

每次将 linux 上的图像加载到内存中时,我都会尝试跟踪信息。理想情况下,我需要

  • 进程的pid,
  • 事件的时间戳,
  • 加载图片的路径,
  • 以及加载图像的内存位置。

我已设法使用 linux 上可用的open_exec 跟踪点获取 pid、时间戳和路径,但在跟踪加载图像的内存位置时遇到问题。有什么建议(跟踪点、标记、系统调用等)我可以如何跟踪这个?

【问题讨论】:

    标签: linux memory kernel trace memory-address


    【解决方案1】:

    一个想法可能是跟踪所有 mmap(2) 调用,其方式类似于 strace(1) 跟踪调用的方式(srace 使用 ptrace(2) API)。您可以通过使用strace (some command) 2> FOO 和 grep mmap FOO 查看所看到的 strace 来尝试自己:

    mmap2(NULL, 40654, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb80e5000
    mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb80e4000
    mmap2(0x724000, 37456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x724000
    mmap2(0x72c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7) = 0x72c000
    mmap2(0x27e000, 117704, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x27e000
    mmap2(0x299000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a) = 0x299000
    mmap2(0x697000, 17008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x697000
    mmap2(0x69b000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3) = 0x69b000
    

    你有每个描述符对应的文件名(来自open(2)),mmap(2)的返回值将是图像在内存中映射的地址。

    根据你如何拦截进程,你也可以在dlopen上注入一个钩子,虽然上面应该足够了

    【讨论】:

    • 谢谢!我会尝试使用 SystemTap 来拦截 mmap2() 调用:)
    • 不幸的是,我正在使用的内核不支持挂钩特定的系统调用(它没有为 SystemTap 启用 CONFIG_DEBUG_INFO 或 CONFIG_KPROBES)。因此,我不能使用 SystemTap。我一直在寻找解决方法以避免重建内核,我发现 perf 可用于使用 mmap() 将用户空间图像路径与其在内存中的位置相关联。您对如何使用 perf 来实现这一点有任何指示吗?
    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多