简介
Valgrind 和GDB是C编程中的两大debug神器,valgrind相比于gdb,没有那么受欢迎,但是在解决偶发型错误,以及内存泄漏等问题时,绝对是一把好手。
今天就结合CS51C这门宝藏课程谈一下valgrind的用法。
参考链接:
基于bork.cc的编译,然后使用
valgrind ./bork hello
基于下列输出,我们可以确认,存在invalid read os size 1, 并且发生在strlen这个函数中。
基于这个信息,我们很容易联想到,strnlen中的字符串不包含终止符号,所以读取了无效内存。再修复了上述错误后,我们在此运行相同的指令。
基于Leak summary的分析,还是存在内存泄漏。如下图所展示。
我们根据建议,执行
valgrind --leak-check=full ./bork hello
、valgrind在这里展示的信息是:泄漏的内存是如何初始化的,从上述可以看出,是调用alloc_str造成了内存泄漏。针对对应创建的对象,我们进行free就可以解决该问题。最后可以看出,一切正常。