在我寻求在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
与free
匹配,只留下alloc
而没有free
对应的广告,例如,分配号{{1} }。
我能想到的是以下shell脚本:
405778
正如您可能已经猜到的那样,这个25MB文件的速度非常缓慢(即每秒2个循环),大约144000 #!/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
s,因为我以极低效的方式使用alloc
。 / p>
如果有人能够在没有花费三个小时的情况下如何实现这一目标的话,我会非常感激。
答案 0 :(得分:3)
awk '/^alloc/ { a[$4]=$0; }
/^free/ { delete a[$4]; }
END { for (i in a) {print a[i]; }' test.txt
答案 1 :(得分: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
。