【发布时间】:2011-12-20 14:34:01
【问题描述】:
我目前正在尝试编写自己的程序来反映 pmap 命令,特别是在 Solaris 9 上。我在解析库的名称和路径时遇到了问题。来自 bash shell 的 Solaris 命令输出如下所示:
bash-2.05# pmap $$
2427: bash
00010000 496K r-x-- /usr/bin/bash
0009A000 80K rwx-- /usr/bin/bash
000AE000 120K rwx-- [ heap ]
FF100000 688K r-x-- /usr/lib/libc.so.1
FF1BC000 24K rwx-- /usr/lib/libc.so.1
FF1C2000 8K rwx-- /usr/lib/libc.so.1
FF200000 568K r-x-- /usr/lib/libnsl.so.1
FF29E000 32K rwx-- /usr/lib/libnsl.so.1
FF2A6000 32K rwx-- /usr/lib/libnsl.so.1
FF2F0000 8K rwx-- [ anon ]
FF300000 16K r-x-- /usr/lib/libmp.so.2
FF314000 8K rwx-- /usr/lib/libmp.so.2
FF320000 8K r-x-- /usr/platform/sun4u-us3/lib/libc_psr.so.1
FF330000 40K r-x-- /usr/lib/libsocket.so.1
FF34A000 8K rwx-- /usr/lib/libsocket.so.1
FF350000 168K r-x-- /usr/lib/libcurses.so.1
FF38A000 32K rwx-- /usr/lib/libcurses.so.1
FF392000 8K rwx-- /usr/lib/libcurses.so.1
FF3A0000 8K r-x-- /usr/lib/libdl.so.1
FF3B0000 8K rwx-- [ anon ]
FF3C0000 152K r-x-- /usr/lib/ld.so.1
FF3F6000 8K rwx-- /usr/lib/ld.so.1
FFBFC000 16K rw--- [ stack ]
total 2536K
我可以通过阅读 /proc/$$/map 来复制程序的基本功能,但剩下的就是弄清楚如何解析库名称,如右图所示。 /proc/$$/map 仅给出 /proc/$$/object 中文件的名称,它们只是通用名称。在 Solaris 10(我有一个盒子)上,我似乎能够使用 /proc/$$/path,其中包含符号链接,但我正在处理的盒子没有这些。有没有人对如何获取这些库名称有任何直接的想法?当我捆绑程序时,它似乎打开 /proc/$$/as 并查看内存并以某种方式找到它们,但我还无法弄清楚它在哪里寻找或为什么。
【问题讨论】:
-
如果你 google 'c pmap',你会发现一个人(旧的)重新设计的 pmap(对于 solaris)。时间不长。也许你可以在那里找到你出错的地方(如果代码仍然有效,考虑到它的年龄)。
-
我找到的是 Linux 的 pmap 实现,不幸的是完全不同,因为 Linux /proc/$$/maps 是一个明文文件,其中包含我需要的所有内容。你看到的还有什么我错过的吗?
-
我又检查了一遍。你说得对。我没有仔细阅读。道歉。不幸的是,我在 Linux 中工作,所以不知道这两种方言的实现有何不同。
-
我不知道它到底是在哪个级别实现的,但是 hub.opensolaris.org/bin/view/Main/get 祝你好运
-
不幸的是,OpenSolaris 版本的工作方式似乎有点不同,至少据我所知。它尝试使用 /proc/$$/path 文件,该文件在我的 Solaris 9 上不存在,否则默认为设备/inode 名称。再次感谢您环顾四周! :)