下面是我努力的细节,它们只与我的问题部分相关:
在内核版本为www.example.com的嵌入式linux(arm)上的/proc/pid/maps中2.6.37.6,第一行(可执行文件本身的代码段)的偏移量似乎是错误的。
我总是看到这样的一行:
00008000-00061000 r-xp 0000000 00:10 8073509 myprog
(the range是进程地址空间中的地址,权限后的数字应该是文件的偏移量)
然而,实际的偏移量似乎是0x 8000--至少,使用这个假设的解释看起来更可信。nm向我展示了myprog在0x 8000之前没有代码,所以这也是有道理的。
有没有人能给予我一个指针,我在哪里可以找到更多关于这一点?我找不到任何东西。
我在做什么:我编写了一个工具来解释mtrace()生成的日志,查找可能的内存泄漏,并将其追溯到分配数据的代码。对于后一步,我从日志中获取一个指令指针,在/proc/pid/maps的运行时Map中查找它,以查找有问题的可执行文件或库,并使用它们的nm-map查找执行分配的实际函数。
除了可执行文件本身之外,这对所有东西都很有效。
1条答案
按热度按时间sirbozc51#
/proc/$PID/maps中的每一行都描述了进程或线程中的一个连续虚拟内存区域。每一行都有以下字段:
*address-这是进程地址空间中区域的起始地址和结束地址
*权限-描述了区域内页面的访问方式,有四种不同的权限:读、写、执行和共享。如果读/写/执行被禁用,则将显示'-'而不是'r'/'w'/'x'。如果区域未被共享,则它是私有的,因此将显示'p'而不是's '。如果进程试图以不允许的方式访问内存,则会生成分段错误。可以使用mprotect系统调用更改权限。
*offset-如果区域是从文件Map(使用mmap),则这是Map开始的文件中的偏移量。如果内存不是从文件Map的,则它只是0。
*device-如果区域是从文件Map的,则这是文件所在的主设备和次设备编号(十六进制)。
*inode-如果区域是从文件Map的,则这是文件编号。
*pathname-如果区域是从文件Map而来,则为文件名。对于匿名Map的区域,此字段为空。还有一些特殊区域的名称,如[heap]、[stack]或[vdso]。[vdso]代表虚拟动态共享对象。系统调用使用它来切换到内核模式。Here's a good article about it.!
你可能会注意到很多匿名区域。这些区域通常是由mmap创建的,但不附加到任何文件。它们用于许多杂项用途,如共享内存或未在堆上分配的缓冲区。例如,我认为pthread库使用匿名Map区域作为新线程的堆栈。