手順
- トレースから Process Map Dump セクションを抽出する
perl -nle '/End of process map dump/ and exit;/Dumping process map/ and $b=$.+1;defined($b) and $.>$b and print;' foo.trc > process_map_dump.txt
- 行番号、マッピング、サイズ(KB)という形式に整形する
perl -lane '($b,$e)=split(/-/,$F[0]);printf(qq/$.\t%s\t%d\n/,$F[5],(hex($e)-hex($b))/1024)' process_map_dump.txt > process_map_size.txt
例
- Linux だと ORA-4030のトレースファイルの process map dump は /proc/pid/maps のままぽいので、/proc/pid/maps を加工する例を記載する。
$ cat /proc/self/maps|perl -lane '($b,$e)=split(/-/,$F[0]);printf(qq/$.\t%s\t%d\n/,$F[5],(hex($e)-hex($b))/1024)' 1 /bin/cat 44 2 /bin/cat 4 3 4 4 /bin/cat 4 5 [heap] 132 6 /lib64/ld-2.12.so 128 7 /lib64/ld-2.12.so 4 8 /lib64/ld-2.12.so 4 9 4 10 /lib64/libc-2.12.so 1580 11 /lib64/libc-2.12.so 2044 12 /lib64/libc-2.12.so 16 13 /lib64/libc-2.12.so 4 14 20 15 /usr/lib/locale/locale-archive 96836 16 12 17 4 18 [stack] 136 19 [vdso] 4 20 [vsyscall] 4
行番号、名前、サイズ(KB)
おまけ
- pmap も /proc/[pid]/maps とかを加工してるだけぽい
$ strace -e open pmap -x $$ open("/etc/ld.so.cache", O_RDONLY) = 3 open("/lib64/libproc-3.2.8.so", O_RDONLY) = 3 open("/lib64/libc.so.6", O_RDONLY) = 3 open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3 open("/proc/self/maps", O_RDONLY) = 0 ★ open("/proc/7993/stat", O_RDONLY) = 3 open("/proc/7993/cmdline", O_RDONLY) = 3 open("/proc/7993/smaps", O_RDONLY) = 0 7993: /bin/zsh Address Kbytes RSS Dirty Mode Mapping 0000000000400000 636 564 0 r-x-- zsh 000000000069f000 24 24 24 rw--- zsh 00000000006a5000 76 36 36 rw--- [ anon ] 00000000008a4000 16 16 0 rw--- zsh 00000000025c6000 1600 1532 1532 rw--- [ anon ] 0000003ba6200000 128 112 0 r-x-- ld-2.12.so 0000003ba641f000 4 4 4 r---- ld-2.12.so 0000003ba6420000 4 4 4 rw--- ld-2.12.so 0000003ba6421000 4 4 4 rw--- [ anon ] 0000003ba6600000 1580 580 0 r-x-- libc-2.12.so 0000003ba678b000 2044 0 0 ----- libc-2.12.so 0000003ba698a000 16 16 4 r---- libc-2.12.so