2012-04-15 69 views
1

所以给出这样的输出:为什么Valgrind在INSIDE有效块中报告读/写错误?

==80518== Invalid read of size 4 
==80518== at 0x558D: Node::ReadFolder(GFile*) (in ./ScribeRecoverMail2) 
==80518== by 0x7B61: Worker::Export(GFile*, GArray<Node*>&) (in ./ScribeRecoverMail2) 
==80518== by 0x8F7A: Worker::Main() (in ./ScribeRecoverMail2) 
==80518== by 0x142D64: ThreadEntryPoint(void*) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi) 
==80518== by 0x47E258: _pthread_start (in /usr/lib/libSystem.B.dylib) 
==80518== by 0x47E0DD: thread_start (in /usr/lib/libSystem.B.dylib) 
==80518== Address 0x1d72f590 is 16 bytes inside a block of size 72 alloc'd 
==80518== at 0x41581: malloc (vg_replace_malloc.c:266) 
==80518== by 0x3D5616: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib) 
==80518== by 0x77A6: Worker::Scan(GFile*, GArray<Node*>&) (in ./ScribeRecoverMail2) 
==80518== by 0x8F0C: Worker::Main() (in ./ScribeRecoverMail2) 
==80518== by 0x142D64: ThreadEntryPoint(void*) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi) 
==80518== by 0x47E258: _pthread_start (in /usr/lib/libSystem.B.dylib) 
==80518== by 0x47E0DD: thread_start (in /usr/lib/libSystem.B.dylib) 
==80518== 
==80518== Invalid read of size 4 
==80518== at 0x10B70F: GFile::Read(void*, int, int) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi) 
==80518== by 0x360E: Node::Read(GFile*, unsigned int&) (in ./ScribeRecoverMail2) 
==80518== by 0x55CF: Node::ReadFolder(GFile*) (in ./ScribeRecoverMail2) 
==80518== by 0x7B61: Worker::Export(GFile*, GArray<Node*>&) (in ./ScribeRecoverMail2) 
==80518== by 0x8F7A: Worker::Main() (in ./ScribeRecoverMail2) 
==80518== by 0x142D64: ThreadEntryPoint(void*) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi) 
==80518== by 0x47E258: _pthread_start (in /usr/lib/libSystem.B.dylib) 
==80518== by 0x47E0DD: thread_start (in /usr/lib/libSystem.B.dylib) 
==80518== Address 0x1a198900 is 0 bytes inside a block of size 24 alloc'd 
==80518== at 0x41581: malloc (vg_replace_malloc.c:266) 
==80518== by 0x3D5616: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib) 
==80518== by 0xDFADB: GFile::GFile() (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi) 
==80518== by 0x8E4E: Worker::Main() (in ./ScribeRecoverMail2) 
==80518== by 0x142D64: ThreadEntryPoint(void*) (in /Users/matthew/Code/Scribe-Branches/v2.00/Utils/ScribeRecoverMail2/build/Debug/ScribeRecoverMail2.app/Contents/Frameworks/Lgi.framework/Versions/A/Lgi) 
==80518== by 0x47E258: _pthread_start (in /usr/lib/libSystem.B.dylib) 
==80518== by 0x47E0DD: thread_start (in /usr/lib/libSystem.B.dylib) 

似乎Valgrind是抱怨正常的日常行为。所讨论的块仍然被分配,并且访问在内存块的开始和结束之内。那么为什么valgrind抱怨?

这个程序确实会在Windows上崩溃,所以我在Mac上构建它,以便valgrind它并查看出错的地方。到目前为止,这些“内部错误”警告很多,但没有像“写入释放内存”或任何东西一样可疑。我很困惑。

PS运行最新的稳定valgrind v3.7.0,编译和安装在同一台机器上,因为我运行它。我一直在使用valgrind,并从未见过这种信息。

+0

GFile :: Read的impl如何显示?看起来地址是指目标内存(GFile的缓冲区),而其源数据是无效的。 – 2012-04-15 08:44:46

+0

嗨弗兰克,这个功能的impl可以在这里找到:http://lgi.svn.sourceforge.net/viewvc/lgi/trunk/src/mac/General/GFile.cpp?revision=393&view=markup – fret 2012-04-18 23:32:18

+0

我是在Linux系统上看到这种valgrind失败:http://stackoverflow.com/questions/30985301/valgrind-reporting-invalid-read-entirely-within-still-allocated-block – Novelocrat 2015-06-22 16:37:13

回答

1

似乎Valgrind是抱怨正常的日常行为

的确如此,这似乎是在Valgrind的的的Mac OSX版本的错误。

您可以尝试创建一个小测试用例并将其报告给Valgrind开发人员。

您也可以尝试address sanitizer并查看报告内容。

+0

“小测试案例”...以及目前的有一个1GB的测试文件:( – fret 2012-04-16 07:07:02

+0

其实我可以在Linux上建立/运行......这可能是Mac的相关Valgrind错误的最终结果,我也会尝试使用地址清理工具,看看这是怎么回事。 – fret 2012-04-16 07:09:12

相关问题