Valgrind 的主要功能
-
内存错误检测(Memcheck):
- 检查非法内存访问(例如,使用未初始化的内存、使用已释放的内存、越界访问)。
- 检测内存泄漏,即程序中没有正确释放的内存。
-
线程错误检测(Helgrind 和 DRD):
- 检查多线程程序中的竞争条件和锁使用错误。
-
缓存分析(Cachegrind):
- 模拟 CPU 缓存,帮助分析程序的缓存使用情况,找出缓存命中率低的代码部分。
-
性能分析(Callgrind):
- 分析程序的函数调用图,评估各个函数的性能,找出性能瓶颈。
-
堆分析(Massif):
- 监控程序的堆内存使用情况,帮助分析内存使用的高峰和瓶颈。
错误
对于程序:
#include <stdio.h>
/* Warning: This program is wrong on purpose. */
int main()
{
int age = 10;
int height = 8;
printf("I am %d years old.\n");
printf("I am %d inches tall.\n", height);
return 0;
}
在内部,printf
会:
- 调用
__printf_buffer
来处理格式字符串"I am %d years old.\n"
和参数age
。 - 当遇到
%d
格式说明符时,__printf_buffer
会调用_itoa_word
来将age
转换为字符串形式。 _itoa_word
返回字符串后,__printf_buffer
继续处理格式化和缓冲,最终输出结果。
(1)依赖于一个未初始化的值
==48399== Conditional jump or move depends on uninitialised value(s)
// 调用顺序 __printf_buffer <- __vfprintf_internal <- printf <- main
==48399== at 0x48D3B59: __printf_buffer (vfprintf-process-arg.c:58)
==48399== by 0x48D46E0: __vfprintf_internal (vfprintf-internal.c:1523)
==48399== by 0x48C986E: printf (printf.c:33)
==48399== by 0x109188: main (ex4.c:11)
(2)处理一个大小为 8 字节的未初始化值
==48399== Use of uninitialised value of size 8
// 调用顺序 __printf_buffer <- __vfprintf_internal <- printf <- main
==48399== at 0x48C877B: _itoa_word (_itoa.c:178)
==48399== by 0x48D29A3: __printf_buffer (vfprintf-process-arg.c:155)
==48399== by 0x48D46E0: __vfprintf_internal (vfprintf-internal.c:1523)
==48399== by 0x48C986E: printf (printf.c:33)
==48399== by 0x109188: main (ex4.c:11)