我必须为大学创建一个程序,并且有一个网站可以测试我使用了多少内存。使用相同的输入,如果我在PC上编译程序并使用valgrind运行它,则表明总堆使用量为77k字节,大约为75 kib。
但是当我在网站上提交它时,使用相同的输入,内存使用结果为384 kib,我不知道valgrind在说谎还是网站醉了。我怀疑我用一个简单的程序编译了程序
gcc myprog.c -o myc
大学网站将其编译为:
/usr/bin/gcc -DEVAL -std=c11 -O2 -pipe -static -s -o program programname.c -lm
我对该编译命令一无所知,这位教授只是写道,该命令已在网站上使用,我也可以在自己的PC上使用它。 如果我使用此编译命令,则程序可以正常运行,但是当我尝试在由它创建的可执行文件上使用valgrind时,它将停止并表示无法继续。
所以问题很快就来了,为什么我看到分配的内存有所不同?是因为此编译命令会执行某些操作吗?
答案 0 :(得分:1)
如果我使用此编译命令,则程序运行正常,但是当 我尝试在由它创建的可执行文件上使用valgrind,它停止了 并说它不能继续
您没有提供确切的错误消息,但是无论如何,Valgrind在静态链接的二进制文件(使用-static
选项构建的二进制文件中)都无法正常工作,请参阅Valgrind errors when linked with -static -- Why?。
为什么我看到分配的内存有所不同?
由于您正在构建动态链接的可执行文件,而网站正在构建静态链接的可执行文件,因此请在Static linking vs dynamic linking中查看它们之间的区别。
请注意,Valgrind并不是衡量二进制文件内存使用情况的唯一工具。您还可以使用/usr/bin/time -v <binary_name>
并在输出中寻找Maximum resident set size
。