C ++コードで特に永続的なメモリリークを見つけるために、すべての割り当てを次の形式でログファイルに書き込むことを解決しました。
<alloc|free> <address> <size> <UNIQUE-ID> <file> <line number>
これは私に、例えば:
alloc 232108 60 405766 file1.cpp (3572)
free 232128 60 405766
alloc 232108 60 405767 file1.cpp (3572)
free 232128 60 405767
alloc 7a3620 12516 405768 file2.cpp (11435)
free 7a3640 12516 405768
alloc 2306c8 256 405769 file3.cpp (3646)
alloc 746160 6144 405770 file3.cpp (20462)
alloc 6f3528 2048 405771 file4.h (153)
alloc 6aca50 128 405772 file4.h (153)
alloc 632ec8 128 405773 file4.h (153)
alloc 732ff0 128 405774 file4.h (153)
free 746180 6144 405770
free 632ee8 128 405773
alloc 6a7610 2972 405778 this_alloc_has_no_counterpart.cpp (123)
free 6aca70 128 405772
free 733010 128 405774
free 6f3548 2048 405771
alloc 6a7610 2972 405775 file3.cpp (18043)
alloc 7a3620 12316 405776 file5.cpp (474)
alloc 631e00 256 405777 file3.cpp (18059)
free 7a3640 12316 405776
free 6a7630 2972 405775
free 631e20 256 405777
free 2306e8 256 405769
私はすべてalloc
をaに一致させ、 sだけを対応するもの(たとえば、割り当て番号)なしfree
で残そうとしています。alloc
free
405778
私が思いつくのは、次のシェルスクリプトです。
#!/bin/sh
grep "^alloc" test.txt | while read line
do
alloc_nr=`echo $line | awk '{ print $4 }'` # arg4 = allocation number
echo "Processing $alloc_nr"
sed -i "/ ${alloc_nr}/{//d}" test.txt
done
ご想像のとおり、これは非常に非効率的な方法でalloc
使用しているため、約144000秒の25MBファイルでは非常に低速です(つまり、1秒あたり2ループ) 。sed
誰かが3時間もかからずにこれを達成する方法について正しい方向に私に微調整を与えることができれば非常にありがたいです。