valgrind 的leak-check
时间: 2023-09-30 10:12:11 浏览: 148
Valgrind是一个用于内存调试和性能分析的强大工具。leak-check是Valgrind的一个选项,用于检测内存泄漏。根据提供的引用内容,我们可以看到不同的leak-check选项被使用。
引用中使用的选项是`--leak-check=full`。这个选项会在程序结束时输出所有内存泄漏的详细信息。
引用中使用的选项是`--leak-check=yes`,这个选项会在程序结束时输出内存泄漏的总结信息,但不会显示具体的泄漏细节。
引用中使用的选项是`--leak-check=yes --leak-check=full`。这个选项组合了前两个引用中使用的选项,既会输出总结信息,也会输出详细的泄漏信息。
综上所述,valgrind的leak-check选项有三种不同的使用方式,可以根据需要选择合适的选项来进行内存泄漏的检测。
相关问题
==8902== LEAK SUMMARY: ==8902== definitely lost: 25,736 bytes in 64 blocks ==8902== indirectly lost: 17,292 bytes in 573 blocks ==8902== possibly lost: 57,662 bytes in 614 blocks ==8902== still reachable: 14,027,394 bytes in 87,658 blocks ==8902== of which reachable via heuristic: ==8902== length64 : 6,096 bytes in 102 blocks ==8902== newarray : 185,200 bytes in 165 blocks ==8902== multipleinheritance: 10,952 bytes in 32 blocks ==8902== suppressed: 0 bytes in 0 blocks ==8902== Reachable blocks (those to which a pointer was found) are not shown. ==8902== To see them, rerun with: --leak-check=full --show-leak-kinds=all ==8902== ==8902== For counts of detected and suppressed errors, rerun with: -v ==8902== Use --track-origins=yes to see where uninitialised values come from ==8902== ERROR SUMMARY: 561 errors from 560 contexts (suppressed: 0 from 0) Segmentation fault (core dumped)
从上述输出中可以看到,程序存在内存泄漏问题。具体情况如下:
- definitely lost: 25,736 bytes in 64 blocks,表示有 64 个内存块被分配但未被释放,总大小为 25,736 字节。
- indirectly lost: 17,292 bytes in 573 blocks,表示有 573 个内存块间接丢失,即这些内存块被分配后的指针丢失,无法再次访问,总大小为 17,292 字节。
- possibly lost: 57,662 bytes in 614 blocks,表示有 614 个内存块可能已经丢失,即这些内存块被分配后的指针没有被释放,但程序结束时可能还可以访问,总大小为 57,662 字节。
- still reachable: 14,027,394 bytes in 87,658 blocks,表示有 87,658 个内存块仍然可以访问,总大小为 14,027,394 字节。
为了找到内存泄漏的地方,可以使用 Valgrind 提供的 "stack trace" 功能来获取指针地址对应的函数调用栈信息。同时,可以使用 --track-origins=yes 选项来查看未初始化的值的来源。需要重新运行 Valgrind,并使用 --leak-check=full --show-leak-kinds=all 选项来查看详细的泄漏信息。最后,需要根据 Valgrind 的输出信息来进行相应的内存泄漏修复工作。
==2872== Process terminating with default action of signal 2 (SIGINT) ==2872== at 0x5550D50: nanosleep (nanosleep.c:28) ==2872== by 0x153E2E: void std::this_thread::sleep_for<long, std::ratio<1l, 1000l> >(std::chrono::duration<long, std::ratio<1l, 1000l> > const&) (in /home/zc/ws/RF_Relay_server/src/RF_Relay) ==2872== by 0x1505B0: main (in /home/zc/ws/RF_Relay_server/src/RF_Relay) ==2872== ==2872== HEAP SUMMARY: ==2872== in use at exit: 188,065 bytes in 997 blocks ==2872== total heap usage: 3,008 allocs, 2,011 frees, 402,131 bytes allocated ==2872== ==2872== LEAK SUMMARY: ==2872== definitely lost: 0 bytes in 0 blocks ==2872== indirectly lost: 0 bytes in 0 blocks ==2872== possibly lost: 2,128 bytes in 7 blocks ==2872== still reachable: 185,937 bytes in 990 blocks ==2872== suppressed: 0 bytes in 0 blocks ==2872== Rerun with --leak-check=full to see details of leaked memory ==2872== ==2872== For counts of detected and suppressed errors, rerun with: -v ==2872== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
这个输出是Valgrind的输出结果,其中包含了程序运行时的内存使用情况,包括内存泄漏等问题。具体来说,这个输出中包含了以下几个部分:
1. Process terminating with default action of signal 2 (SIGINT)
这个部分表示程序因为接收到了SIGINT信号而退出。SIGINT信号通常是由于用户发送了中断信号,比如在终端中按下了Ctrl+C。
2. at 0x5550D50: nanosleep (nanosleep.c:28)
这个部分表示程序在退出时正在执行nanosleep函数,位于nanosleep.c文件的第28行。
3. HEAP SUMMARY
这个部分是程序内存使用情况的总结,包括在退出时仍然在使用的内存和已经释放的内存等信息。
4. LEAK SUMMARY
这个部分是程序内存泄漏情况的总结,包括已经泄漏的内存和可能存在的泄漏等信息。其中,definitely lost表示已经确认的内存泄漏,indirectly lost表示间接的内存泄漏,possibly lost表示可能存在的内存泄漏,still reachable表示仍然可以访问但是没有被释放的内存。
5. Rerun with --leak-check=full to see details of leaked memory
这个部分提示你可以使用--leak-check=full选项来查看内存泄漏的详细信息。
需要注意的是,Valgrind的输出信息可能会比较详细,需要耐心查看。另外,在程序中尽可能避免内存泄漏和其他内存错误,可以提高程序的稳定性和性能。
阅读全文