我正在尝试使用valgrind跟踪由测试人员向我报告的内存泄漏,该报告使用valgrind报告内存泄漏,并在其分配时报告回溯。不幸的是,他们报告的文件自测试以来发生了重大变化。我正在试图找出他们测试的版本。为此,我想查看文件在给定的行号(来自valgrind报告),在linux / bash系统上使用git进行给定函数调用。
换句话说,valgrind报告在追溯中有这样的东西:
function1 (file1.c:line1)
function2 (file2.c:line2)
假设行号是正确的(即:函数没有包含在可能混淆valgrind的宏或内联中),我正在寻找file2.c的版本,其中line2包含字符串“function1”。
我的尝试首先使用“git log --follow file2.c | grep ^ commit”。作为一个快速测试,我收集了这个输出:
commit f267c7671a8af8a4c97b5c4938bab3a7099d50ea
commit 3f45349afc39b5c3ed6a6517ee4a2008d21f9047
commit 09e489d88ecc9e0adee326d68f18834753ddbcdd
commit 14ae0ab236bea453a9e2af81b507fe8243813b34
commit e1c1b28671a5c957c77ce54a45ce7e1694a64592
commit 7a45c4761c7f0d2263934d254c50052941d0c9e7
commit db9e61c3253a8c6966ecf334ff9c394e17966188
...about a hundred SHA1 labels...
进入编辑器,用以下内容搜索/替换每一行:
show f267c7671a8af8a4c97b5c4938bab3a7099d50ea:file2 | sed -n(line2)p
show 3f45349afc39b5c3ed6a6517ee4a2008d21f9047:file2 | sed -n(line2)p
show 09e489d88ecc9e0adee326d68f18834753ddbcdd:file2 | sed -n(line2)p
show 14ae0ab236bea453a9e2af81b507fe8243813b34:file2 | sed -n(line2)p
show e1c1b28671a5c957c77ce54a45ce7e1694a64592:file2 | sed -n(line2)p
show 7a45c4761c7f0d2263934d254c50052941d0c9e7:file2 | sed -n(line2)p
show db9e61c3253a8c6966ecf334ff9c394e17966188:file2 | sed -n(line2)p
...
但我没找到匹配。我做了一些检查,确实找到了一个“一个一个”行号的匹配(我发现valgrind行号在我们的系统中通常是准确的,但也许它可能是一个一个)。
所以我的第一个问题是,“git log”真的会告诉我该文件的所有版本吗?假设没有人在存储库中重写历史记录。我想知道我是否错过了这种方法的版本。
我的第二个问题是,有一种很好的方法可以实现自动化吗?理想情况下,我正在考虑一个脚本,它将采用文件名和行范围(lineA到lineC),并报告每个版本:
(shaX) lineA : contentsXA
(shaX) lineB : contentsXB
(shaX) lineC : contentsXC
(shaY) lineA : contentsYA
(shaY) lineB : contentsYB
(shaY) lineC : contentsYC
(shaZ) lineA : contentsZA
(shaZ) lineB : contenstZB
(shaZ) lineC : contentsZC
我可以为我正在寻找的字符串grep输出,我会看到包含该字符串的版本的SHA。或者有更好的方法来解决这个问题吗?
答案 0 :(得分:1)
使用git存储库并从check_sha1_signature
中选择sha1_file.c
作为具体示例,您可以看到使用
git log --format=format:%H -- sha1_file.c | \
xargs -I SHA1 env GIT_PAGER=cat \
git grep --word-regexp --line-num check_sha1_signature SHA1 -- sha1_file.c
由于源文件的名称是在git grep
命令中硬编码的,因此不会重命名。