3

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で残そうとしています。allocfree405778

私が思いつくのは、次のシェルスクリプトです。

#!/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時間もかからずにこれを達成する方法について正しい方向に私に微調整を与えることができれば非常にありがたいです。

4

2 に答える 2

3

行全体ではなく、IDのみが必要なようです。

$ awk '{print $4}' file | sort | uniq -u
405778

awk '{print $4}'ID列のみを出力します。

sort列を並べ替えます。

uniq -u一意のIDのみを表示します。

編集:

grep -f - fileライン全体に一致するようにパイプします。ループする必要はありません。

$ awk '{print $4}' file | sort | uniq -u | grep -f - file
alloc 6a7610   2972   405778 this_alloc_has_no_counterpart.cpp (123)

grep -fファイルのパターンと一致し、を使用することを-意味しますstdin

于 2012-12-20T10:05:02.943 に答える
3
awk '/^alloc/ { a[$4]=$0; }
     /^free/ { delete a[$4]; }
     END { for (i in a) {print a[i]; }' test.txt
于 2012-12-20T10:03:22.577 に答える