c cpp 代码 数据竞争 分析, 以及 内存泄露 分析 工具 使用 demo

简介: c cpp 代码 数据竞争 分析, 以及 内存泄露 分析 工具 使用 demo

race_check_and_mem_leak_on_cpp

问题代码

v1_race 版本

test_race_and_leak.cpp

#include <pthread.h>
#include <iostream>
static int a;
void *_work_1(void *args)
{
    for (int i = 0; i < 1000; i++)
    {
        a += 1;
    }
    int *x = new int;
    return 0;
}
int main(int argc, char *argv[])
{
    a = 0;
    int count = 1000;
    pthread_t cThreads[count];
    for (int i = 0; i < count; i++)
    {
        pthread_create(&cThreads[i], NULL, _work_1, NULL);
    }
    for (int i = 0; i < count; i++)
    {
        pthread_join(cThreads[i], NULL);
    }
    std::cout << " a : " << a << std::endl;
    return 0;
}

build code

g++ -o test_race_and_leak test_race_and_leak.cpp -lpthread
# 正确结果 应该是 
1000000
# 多次 运行 结果 都小于 1000000
# 说明出现了 data race 数据 争抢 以及 脏读
./test_race_and_leak
a : 999700

race 数据 竞争 分析

https://stackoverflow.com/questions/5360491/how-i-can-detect-memory-leaks-of-c-application-in-linux-ubuntu-os

https://valgrind.org/


检查后 提示 出现了 数据争抢 发生在

0x10C158 同时被 线程 2 线程 3 写入 4 bytes, 也就是 一个 整形的大小

apt install valgrind -y
valgrind --tool=memcheck <your_app> <your_apps_params>
valgrind --tool=memcheck  test_race_and_leak
./test_race_and_leak
 a : 999779
# 数据 竞争 检查
valgrind --tool=helgrind  ./test_race_and_leak
# ==2592589== Possible data race during write of size 4 at 0x10C158 by thread #3
# ==2592589== Locks held: none
# ==2592589==    at 0x10924E: _work_1(void*) (in /root/learn_threads/test_race_and_leak)
# ==2592589==    by 0x4842B1A: ??? (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_helgrind-amd64-linux.so)
# ==2592589==    by 0x4865608: start_thread (pthread_create.c:477)
# ==2592589==    by 0x4B83292: clone (clone.S:95)
# ==2592589==
# ==2592589== This conflicts with a previous write of size 4 by thread #2
# ==2592589== Locks held: none
# ==2592589==    at 0x10924E: _work_1(void*) (in /root/learn_threads/test_race_and_leak)
# ==2592589==    by 0x4842B1A: ??? (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_helgrind-amd64-linux.so)
# ==2592589==    by 0x4865608: start_thread (pthread_create.c:477)
# ==2592589==    by 0x4B83292: clone (clone.S:95)
# ==2592589==  Address 0x10c158 is 0 bytes inside data symbol "_ZL1a"
# ==2592589==
#  a : 1000000
# ==2592589==
# ==2592589== Use --history-level=approx or =none to gain increased speed, at
# ==2592589== the cost of reduced accuracy of conflicting-access information
# ==2592589== For lists of detected and suppressed errors, rerun with: -s
# ==2592589== ERROR SUMMARY: 1998 errors from 2 contexts (suppressed: 0 from 0)

内存泄露检查

检查后 提示 出现了 内存 泄露 发生在

malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)

by 0x10942E: main (in /root/learn_threads/test_race_and_leak)

# 内存 泄露检查
valgrind --tool=memcheck  --leak-check=full -s ./test_race_and_leak
# ==2599297== HEAP SUMMARY:
# ==2599297==     in use at exit: 100 bytes in 1 blocks
# ==2599297==   total heap usage: 1,003 allocs, 1,002 frees, 361,828 bytes allocated
# ==2599297== 
# ==2599297== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1
# ==2599297==    at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
# ==2599297==    by 0x10942E: main (in /root/learn_threads/test_race_and_leak)
# ==2599297== 
# ==2599297== LEAK SUMMARY:
# ==2599297==    definitely lost: 100 bytes in 1 blocks
# ==2599297==    indirectly lost: 0 bytes in 0 blocks
# ==2599297==      possibly lost: 0 bytes in 0 blocks
# ==2599297==    still reachable: 0 bytes in 0 blocks
# ==2599297==         suppressed: 0 bytes in 0 blocks
# ==2599297== 
# ==2599297== For lists of detected and suppressed errors, rerun with: -s
# ==2599297== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
相关文章
|
24天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
11天前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
33 11
|
3天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
17 1
|
19天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
29天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
158 9
|
2月前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
1月前
|
存储 JavaScript 前端开发
如何优化代码以避免闭包引起的内存泄露
本文介绍了闭包引起内存泄露的原因,并提供了几种优化代码的策略,帮助开发者有效避免内存泄露问题,提升应用性能。
|
2月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
2月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
64 1
|
2月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。