Valgrind内存工具

 Valgrind 的主要功能

  1. 内存错误检测(Memcheck):

    • 检查非法内存访问(例如,使用未初始化的内存、使用已释放的内存、越界访问)。
    • 检测内存泄漏,即程序中没有正确释放的内存。
  2. 线程错误检测(Helgrind 和 DRD):

    • 检查多线程程序中的竞争条件和锁使用错误。
  3. 缓存分析(Cachegrind):

    • 模拟 CPU 缓存,帮助分析程序的缓存使用情况,找出缓存命中率低的代码部分。
  4. 性能分析(Callgrind):

    • 分析程序的函数调用图,评估各个函数的性能,找出性能瓶颈。
  5. 堆分析(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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值