当前位置: 首页 > article >正文

内存检查之Valgrind工具

内存检查之Valgrind工具


Author: Once Day Date: 2025年3月26日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSDN博客

参考文章:

  • 【代码质量】如何使用Valgrind检测内存泄漏_valgrind: no program specified_Acuity.的博客-CSDN博客
  • Linux下几款C++程序中的内存泄露检查工具_testsuite kmalloc_CHENG Jian的博客-CSDN博客
  • 深入内存调试:Valgrind工具的终极指南 - 知乎
  • 嵌入式开发经验:C流程分析与代码调优手段 – YURI BLOG
  • Valgrind Home
  • Valgrind

文章目录

  • 内存检查之Valgrind工具
        • 1. Valgrind介绍
          • 1.1 概述
          • 1.2 原理概述
          • 1.3 Memcheck工具
          • 1.4 Callgrind工具
          • 1.5 Cachegrind工具
          • 1.6 Helgrind工具
          • 1.7 Massif工具
        • 2. 内存检测实践
        • 3. Valgrind与Gitlab流水线集成

1. Valgrind介绍
1.1 概述

Valgrind是一个功能强大的开源动态分析工具,主要用于检测和调试C/C++程序中的内存管理和线程同步问题。它最初由Julian Seward在2000年开发,旨在帮助程序员发现难以捕捉的bug,特别是那些与内存相关的错误,如内存泄漏、越界访问、使用未初始化的内存等。

经过多年的发展和完善,Valgrind已经成为了业界广泛使用的调试工具之一。它不仅支持Linux,还可以在macOS和Android等平台上运行。除了最初的内存检测功能,Valgrind还不断集成了其他功能模块,如性能分析、线程错误检测、缓存和分支预测分析等,使其成为一个多功能的分析工具套件。

Valgrind的工作原理是在程序运行时对其进行插桩和模拟,记录和分析程序的每一次内存操作和线程同步操作,从而发现潜在的错误。虽然这种方式会使程序的运行速度降低数十倍,但对于追踪难以复现的bug和提高程序运行时的鲁棒性来说,这种性能损失是值得的。

Valgrind的价值在于,它能帮助程序员及早发现和修复潜伏的内存和线程问题,减少因这些问题导致的程序崩溃、数据损坏、安全漏洞等风险。同时,通过Valgrind的性能分析功能,开发者还可以找出程序的性能瓶颈,进行针对性的优化。

Valgrind包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。

1.2 原理概述

Valgrind的核心原理是通过模拟一个虚拟的CPU环境,对程序的执行进行动态分析和检测。它利用两个关键的数据结构:Valid-Value表和Valid-Address表,来记录和跟踪内存的状态。

具体来说,对于进程地址空间中的每一个字节,Valgrind都为其分配8个bits在Valid-Value表中,用于记录该字节是否已经被初始化并具有有效的值。同时,对于CPU的每个寄存器,也有对应的bit向量来记录其值的有效性。

另一方面,Valid-Address表则为每个字节分配1个bit,用于标识该内存地址是否可以被合法地读写。

当程序执行时,Valgrind的虚拟CPU环境会拦截每一次内存访问和寄存器操作。在读写内存时,它首先检查Valid-Address表中对应的bit,如果该bit表明此地址是无效的,则报告读写错误。

而当内存中的数据被加载到真实CPU的寄存器中时,Valgrind会将对应的Valid-Value bits也加载到虚拟CPU环境中。一旦寄存器中的值被用于计算内存地址或影响程序输出,Valgrind就会检查相应的Valid-Value bits,如果发现使用了未初始化的值,就会报告错误。

由于Valgrind需要对每一个字节和寄存器都进行状态跟踪,并在虚拟CPU环境中模拟执行,因此它会显著增加内存消耗,并使得程序的运行速度比在实际CPU上慢20到30倍。

1.3 Memcheck工具

Memcheck是Valgrind工具套件中最常用和最强大的工具之一,主要用于检测C/C++程序中与内存相关的错误。它通过拦截程序中的内存管理函数调用,并对内存的分配、使用和释放进行跟踪和检查,从而发现各种内存问题。

Memcheck的主要功能包括:

  • 检测未释放的内存(Memory Leak):识别程序中那些已分配但没有正确释放的内存块,帮助避免内存泄漏导致的资源浪费和程序长时间运行后的崩溃。
  • 检测越界访问(Out-of-bounds Access):发现程序读写内存时越过了已分配的内存块边界,避免缓冲区溢出等问题。
  • 检测使用未初始化的内存(Use of Uninitialized Memory):找出程序中使用了未经初始化的变量或内存块的情况,这可能导致程序行为不确定或产生意外结果。
  • 检测非法释放(Invalid Free):识别那些对已经释放的内存块或不是由malloc等分配函数返回的内存指针进行释放的操作,避免双重释放或释放无效指针等错误。
  • 检测重叠内存操作(Overlapping Memory Operation):发现类似strcpy、memcpy等函数在执行时源内存块和目标内存块存在重叠的情况,这可能导致数据损坏。

Memcheck通过在程序运行时动态插入检测代码,对内存访问进行拦截和检查,一旦发现上述问题,就会生成详细的错误报告,包括错误类型、发生位置、涉及的内存地址和调用栈等信息,帮助程序员快速定位和修复内存相关的bug。

1.4 Callgrind工具

Callgrind是Valgrind工具套件中的一个性能分析工具,主要用于帮助开发者深入理解程序的运行行为和优化程序性能。它通过记录程序执行过程中的函数调用关系和指令执行情况,生成详细的性能分析报告,揭示程序的性能瓶颈和优化机会。

Callgrind的主要功能包括:

  • 函数调用关系分析:Callgrind会跟踪记录程序运行过程中的函数调用关系,生成函数调用图(Call Graph)。通过调用图,开发者可以清晰地了解程序的函数调用层次和调用频率,识别出调用关系复杂或者调用频繁的函数,从而进行针对性的优化。
  • 指令级别的性能分析:Callgrind不仅记录函数调用关系,还会统计每个函数中各个代码行或指令的执行次数和占用的时间。这种细粒度的性能数据可以帮助开发者发现函数内部的性能热点,如频繁执行的循环或者耗时的语句,从而进行代码级别的优化。
  • 支持可视化分析:Callgrind生成的性能分析数据可以通过专门的可视化工具(如KCachegrind)进行查看和分析。这些工具提供了直观的图形界面,允许开发者交互式地探索函数调用关系、查看代码的执行频率和时间占用等,使性能问题更容易被发现和理解。
  • 支持抽样分析:对于长时间运行的程序,Callgrind还提供了抽样分析的功能。即以一定的时间间隔对程序进行采样,记录采样点的函数调用和指令执行情况。这种方式可以在较低的性能开销下,获得程序整体执行情况的统计信息,帮助开发者识别性能瓶颈。

Callgrind通过详细记录程序的函数调用和指令执行情况,为性能调优提供了丰富的数据支持。它可以帮助开发者深入理解程序的运行行为,发现性能瓶颈,并指导代码优化的方向。

1.5 Cachegrind工具

Cachegrind是Valgrind工具套件中的另一个性能分析工具,主要用于帮助开发者优化程序的缓存性能。现代计算机系统中,CPU的运算速度远快于内存的访问速度,为了弥补这种差距,通常会在CPU和主存之间引入多级缓存(Cache)。程序的缓存利用率对整体性能有着关键的影响。Cachegrind通过模拟CPU的缓存层次结构,收集和分析程序的缓存使用情况,帮助开发者发现和优化程序中的缓存问题。

Cachegrind的主要功能包括:

  • 缓存命中和丢失统计:Cachegrind会精确地记录程序执行过程中的缓存命中(Hit)和缓存丢失(Miss)次数。它提供了对各级缓存(如L1、L2、L3等)的访问统计,以及命中率和丢失率等关键指标。通过分析这些数据,开发者可以发现程序中缓存利用率低下的代码区域,进而进行针对性的优化。
  • 代码行级别的缓存分析:除了整体的缓存统计数据,Cachegrind还能提供详细到代码行级别的缓存使用情况。它记录了每行代码的缓存命中和丢失次数,帮助开发者精确定位导致缓存问题的具体代码位置。这对于优化关键循环和热点函数的缓存表现尤为重要。
  • 支持多级缓存分析:Cachegrind可以模拟不同层次和大小的缓存结构,如L1数据缓存、L1指令缓存、L2缓存等。它能够分别统计各级缓存的访问情况,帮助开发者全面了解程序在不同缓存层次上的表现,进行有针对性的优化。
  • 与性能分析工具集成:Cachegrind生成的缓存分析数据可以与其他性能分析工具(如Callgrind)结合使用。这样可以将缓存性能数据与函数调用关系和指令执行情况关联起来,更全面地分析程序的性能特征,找出可优化的瓶颈。

对于需要高性能的程序,如科学计算、数据库等,Cachegrind的缓存分析能力可以帮助开发者显著提升程序的运行效率。

1.6 Helgrind工具

Helgrind是Valgrind工具套件中专门用于检测多线程程序中同步问题的工具。在现代并发编程中,线程同步和互斥操作是保证程序正确性和避免竞态条件的关键。然而,开发者在编写多线程程序时,经常会引入一些微妙而难以发现的同步错误,如死锁、数据竞争等。Helgrind通过动态分析程序的执行,检测和报告多线程程序中的同步问题,帮助开发者编写正确且高效的并发程序。

Helgrind的主要功能包括:

  • 检测数据竞争(Data Race):当多个线程并发访问共享数据,且至少有一个线程进行写操作时,如果没有适当的同步机制,就会导致数据竞争。Helgrind会跟踪线程对共享数据的访问,并检测潜在的数据竞争条件。它会报告发生竞争的代码位置和相关的线程信息,帮助开发者定位和修复问题。
  • 检测锁的使用错误:Helgrind会检查程序中锁的使用是否正确,如锁的初始化、销毁、加锁和解锁操作是否配对。它还会检测潜在的死锁情况,如多个线程以不同的顺序获取锁导致的循环等待。Helgrind的锁使用分析可以帮助开发者识别锁的使用错误,避免死锁和其他同步问题。
  • 检测条件变量的使用错误:条件变量是另一种常用的线程同步机制。Helgrind会检查程序中条件变量的使用是否正确,如等待和通知操作是否与适当的互斥锁配合使用。它还会检测潜在的信号丢失和虚假唤醒等问题,帮助开发者正确使用条件变量进行线程间通信。
  • 支持标注和抑制:Helgrind提供了一些特殊的函数标注,允许开发者在代码中显式标记某些同步操作或忽略某些警告。这对于处理一些特殊的同步模式或抑制误报非常有用。通过合理使用标注,开发者可以优化Helgrind的分析结果,减少误报并关注真正的问题。

对于开发大型并发程序、并行算法库或多线程服务器程序的开发者来说,Helgrind是一个非常有价值的工具。它可以在开发和测试阶段及早发现并发问题,避免这些问题在生产环境中导致难以诊断和修复的故障。

1.7 Massif工具

Massif是Valgrind工具套件中专门用于检测和分析程序堆内存使用情况的工具。在长时间运行或处理大量数据的程序中,内存的使用情况对性能和资源消耗有着重要影响。Massif通过跟踪和记录程序在堆上的内存分配和释放操作,生成详细的内存使用报告,帮助开发者分析内存使用模式,发现内存泄漏和优化内存管理。

Massif的主要功能包括:

  • 堆内存分配和使用跟踪:Massif会拦截程序中的内存分配和释放函数(如malloc、free等),记录每次操作的时间、大小和调用栈信息。通过对这些信息的分析,Massif可以生成程序在不同时间点的内存使用快照,展示内存使用量的变化趋势和分配模式。
  • 内存使用量的可视化分析:Massif生成的内存分析数据可以通过专门的可视化工具(如ms_print)进行查看和分析。这些工具提供了直观的图表和报告,展示了程序在不同时间点的内存使用量、内存分配和释放的时间线、以及各个函数或代码块的内存占用情况。开发者可以通过可视化分析,快速定位内存使用异常的位置和模式。
  • 检测内存泄漏:Massif可以帮助开发者发现程序中的内存泄漏问题。通过比较不同时间点的内存快照,Massif可以识别出那些被分配但从未释放的内存块。这些内存块可能是由于忘记释放或程序逻辑错误导致的内存泄漏。Massif的内存泄漏检测能力可以帮助开发者及时修复这些问题,避免长时间运行的程序出现内存溢出或性能下降。
  • 支持多种内存分配器:Massif支持分析使用不同内存分配器的程序,如系统默认的malloc/free、自定义的内存分配器等。这使得Massif可以适用于各种内存管理模型的程序,提供全面的内存使用分析。

对于需要长时间运行或处理大量数据的程序,如服务器程序、数据处理应用等,Massif可以帮助开发者优化内存使用,提高程序的性能和稳定性。

2. 内存检测实践

测试源码如下:

#include <stdio.h>
#include <stdlib.h>void leak_memory()
{int *ptr = (int *)malloc(sizeof(int));*ptr     = 42;// 忘记释放ptr指向的内存
}void invalid_access() {int* ptr = (int*)malloc(sizeof(int) * 5);ptr[5] = 42;  // 访问数组边界之外的元素free(ptr);
}void invalid_free() {int* ptr = (int*)malloc(sizeof(int));free(ptr);free(ptr);  // 重复释放同一块内存
}void use_uninitialized() {int* ptr = (int*)malloc(sizeof(int));printf("Uninitialized value: %d\n", *ptr);  // 读取未初始化的内存free(ptr);
}int main()
{leak_memory();invalid_access();invalid_free();use_uninitialized();return 0;
}

编译之后使用Valgrind进行检测:

无效内存访问:

在这里插入图片描述

无效free操作:

在这里插入图片描述

无效初始值:在这里插入图片描述

内存泄漏情况:

在这里插入图片描述

下面是对Valgrind Memcheck工具输出的关键字段的解释:

  • ==2475658== Memcheck, a memory error detector,这行表示使用的是Valgrind的Memcheck工具,它是一个内存错误检测器。
  • ==2475658== HEAP SUMMARY,这行标志着堆内存使用情况摘要部分的开始。
  • in use at exit: 4 bytes in 1 blocks,这行表示在程序退出时,仍有4字节内存在1个块中处于使用状态,没有被释放。
  • total heap usage: 1 allocs, 0 frees, 4 bytes allocated,这行给出了整个程序运行过程中堆内存的使用情况。总共分配了1次内存,共4字节,没有任何内存释放操作。
  • 4 bytes in 1 blocks are definitely lost in loss record 1 of 1,这行指出了确定的内存泄漏情况。有4字节内存在1个块中被确定为泄漏,这是本次检测发现的唯一一处内存泄漏。
  • at 0x484880F: malloc (vg_replace_malloc.c:446)...,这几行给出了内存泄漏发生的代码位置信息,包括分配内存的malloc调用、泄漏发生的函数leak_memory以及主函数main。行号信息精确指出了泄漏发生的代码行。
  • LEAK SUMMARY:,这行标志着内存泄漏情况摘要部分的开始。
  • definitely lost: 4 bytes in 1 blocks,指确定泄露的内存,强调了确定泄漏的内存大小和块数。
  • indirectly lost: 0 bytes in 0 blocks,指间接泄露的内存,其总是与 definitely lost 一起出现,只要修复 definitely lost 即可恢复。当使用了含有指针成员的类或结构时可能会报这个错误。
  • possibly lost: 0 bytes in 0 blocks,指可能泄露的内存,大多数情况下应视为与 definitely lost 一样需要尽快修复。当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存的起始地址,但可以访问其中的某一部分数据,则会报这个错误。
  • still reachable: 0 bytes in 0 blocks,如果程序是正常结束的,那么它可能不会造成程序崩溃,但长时间运行有可能耗尽系统资源,因此笔者建议修复它。如果程序是崩溃(如访问非法的地址而崩溃)而非正常结束的,则应当暂时忽略它,先修复导致程序崩溃的错误,然后重新检测。
  • suppressed: 0 bytes in 0 blocks,已被解决。出现了内存泄露但系统自动处理了,可以无视这类错误。
  • ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0),这行给出了错误摘要,表明本次运行总共发现了1个错误,来自1个上下文,没有任何错误被抑制。

通过仔细阅读Valgrind Memcheck的输出信息,可以确定内存泄漏发生的位置、泄漏的内存大小,以及整个程序的堆内存使用情况。

3. Valgrind与Gitlab流水线集成

在C/C++项目开发过程中,可以将单元测试放到Valgrind里面执行,从而检查程序是否存在内存问题,主要包括以下五类问题:

  • 内存泄漏(Memory Leaks),发现未释放的内存,防止程序长期运行时占用过多内存。
  • 无效的内存访问(Invalid Memory Access),访问未分配的内存(如越界访问数组),访问已释放的内存(使用了 free 之后的指针)。
  • 未初始化内存使用(Use of Uninitialized Memory),变量未初始化就被使用,可能导致程序行为不确定。
  • 重叠的 memcpy 或 memmove 操作,可能导致数据损坏。
  • 非法的 free 操作(Invalid Free),释放未分配的指针或重复释放同一块内存。

在ubuntu上安装valgrind非常方便:

sudo apt-get install valgrind

我们使用如下的脚本来辅助执行应用程序,里面指定需要抑制的内存错误(有一些测试套件或者用例自身的问题无需关注):

#!/bin/bash# 开启调试
# set -x# 当前目录路径
export SOURCE_DIR=${SOURCE_DIR:-$(pwd)}# 导入基本shell工具函数
source $SOURCE_DIR/scripts/utils.sh# 如果 GEN_SUPPRESSIONS=ON, 则生成suppressions文件
export GEN_SUPPRESSIONS=${GEN_SUPPRESSIONS:-OFF}# 运行所有单元测试
./scripts/run_valgrind.sh test_program

run_valgrind.sh脚本的内容如下:

#!/bin/bash# 开启shell调试
# set -x# 当前目录路径, 默认是当前目录的父目录
export SOURCE_DIR=${SOURCE_DIR:-$(dirname $(pwd))}# 导入基本ANMK shell工具函数
source $SOURCE_DIR/scripts/utils.sh
source $SOURCE_DIR/scripts/run_environment.sh# 内存检测工具 Valgrind:
# --tool=memcheck: 使用valgrind的memcheck内存检测工具
# --leak-check=full: 进行完整的内存泄漏检测
# --show-leak-kinds=all: 显示所有类型的内存泄漏
# --track-origins=yes: 跟踪内存泄漏的来源,即泄漏发生的具体位置
# 所以总结起来,这个valgrind命令的作用是:
#   使用memcheck工具,进行完整和详细的内存泄漏检测,显示所有的内存泄漏信息,并跟踪泄漏发生的准确位置。
#   通过使用这些参数,可以非常方便和详细地调试程序中的内存泄漏问题。
#   memcheck工具会打印每个泄漏发生的堆栈信息,以及泄漏的大小等信息。
MEMCHECK="valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --track-origins=yes -s"# 添加额外规则, 追踪子进程, 必要时候生成抑制规则 GEN_SUPPRESSIONS定义为1
MEMCHECK="${MEMCHECK} --trace-children=yes --suppressions=$SOURCE_DIR/valgrind-ignore.txt"
if [ "$GEN_SUPPRESSIONS" = "ON" ]; thenMEMCHECK="${MEMCHECK} --gen-suppressions=yes"
fi# 发现错误时, exit code不为0
MEMCHECK="${MEMCHECK} --error-exitcode=1"INFO "MEMCHECK: [$MEMCHECK]"# 排除在外的单元测试用例, 主要是CheckDeathTest
EXECUTE_ARGS="--gtest_filter=-CheckDeathTest*"# 运行所有内存测试
run_programs "$MEMCHECK" "$EXECUTE_ARGS" $@
return_code=$?# 重置环境
environment_reset# 返回值
if [ $return_code -ne 0 ]; thenERROR "Run memory test failed"exit 1
fiINFO "Run memory test success"
exit 0

在这个脚本里,使用MEMCHECK指定Valgrind的运行参数,通过--error-exitcode=1让Valgrind检测到内存错误后返回1,从而传递错误情况到外部执行端。

Gitlab-ci.yaml流水线配置如下:

# 本地开发版本 - 内存测试, 用于通用X86-64环境下测试
develop-memory:stage: local-teststags:- anmk-buildneeds:- job: develop-buildartifacts: true- job: develop-debug-unittestartifacts: falsescript:- echo "Test Project - Develop Version - Memory Test"- ./run_mem_test.sh- echo "Test finished"






Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

相关文章:

内存检查之Valgrind工具

内存检查之Valgrind工具 Author: Once Day Date: 2025年3月26日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSD…...

强大的AI网站推荐(第四集)—— Gamma

网站&#xff1a;Gamma 号称&#xff1a;展示创意的新媒介 博主评价&#xff1a;快速展示创意&#xff0c;重点是展示&#xff0c;在几秒钟内快速生成幻灯片、网站、文档等内容 推荐指数&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x…...

javafx项目结构+代码规范

javafx项目 1. 新建项目&#xff0c;对项目的理解 jdk&#xff1a; 是 Java Development ToolKit 的简称&#xff0c;也就是 Java 开发工具包。JDK 是整个 Java 的核心&#xff0c;包括 Java 运行环境&#xff08;Java Runtime Envirnment&#xff0c;简称 JRE&#xff09;&a…...

国外计算机证书推荐(考证)(6 Sigma、AWS、APICS、IIA、Microsoft、Oracle、PMI、Red Hat)

文章目录 证书推荐1. 六西格玛 (6 Sigma)2. 亚马逊网络服务 (AWS)3. 美国生产与库存控制学会 (APICS)4. 内部审计师协会 (IIA)5. 微软 (Microsoft)6. 甲骨文 (Oracle)7. 项目管理协会 (PMI)8. 红帽 (Red Hat) 证书推荐 1. 六西格玛 (6 Sigma) 介绍&#xff1a;六西格玛是一种…...

黑盒测试与白盒测试详解

黑盒测试和白盒测试是软件测试中两种最基本的测试方法&#xff0c;它们在测试视角、测试重点和适用场景等方面存在显著差异。 一、黑盒测试 1. 基本概念 黑盒测试又称功能测试&#xff0c;将软件视为一个"黑盒子"&#xff0c;不关心内部结构和实现细节&#xff0c;只…...

准确--配置服务器文件数

某些系统可能在 /etc/security/limits.d/ 目录下有额外配置覆盖全局设置。检查是否存在冲突文件&#xff1a; ls /etc/security/limits.d/如果有文件&#xff08;如 90-nproc.conf 或 90-nofile.conf&#xff09;&#xff0c;需编辑或删除这些文件中的冲突配置。 确保系统启用…...

《熔化焊接与热切割作业》考试注意事项

考试前的准备 携带必要的证件和材料&#xff1a;考生需携带身份证、准考证等有效证件&#xff0c;以及考试所需的焊接工具、材料等。确保证件齐全&#xff0c;避免因证件问题影响考试。 提前检查焊接设备和工具&#xff1a;在考试前&#xff0c;考生应仔细检查焊接设备和工具是…...

ROS2的发展历史、核心架构和应用场景

以下是对**ROS2&#xff08;Robot Operating System 2&#xff09;**的发展历史、核心架构和应用场景的详细解析&#xff0c;覆盖其技术演变、关键特性和生态系统&#xff1a; 一、ROS2的诞生背景&#xff1a;从ROS1到ROS2 1. ROS1的历史与局限 ROS1的起源&#xff1a; 2007年…...

[unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用

当我打开一个二级弹窗后&#xff0c;希望可以通过点击弹窗以外的区域来关闭该弹窗。一开始我是在弹窗主节点上挂载了一个 button 组件&#xff0c;该 button 注册的点击事件中关闭该弹窗。在子节点&#xff08;一个背景图&#xff09;的image组件上启用 Raycast Target 选项&am…...

鸿蒙生态全解析:应用适配分享

一、鸿蒙系统的技术底座与适配挑战 HarmonyOS NEXT 作为全场景分布式操作系统&#xff0c;通过统一的技术底座和声明式开发框架&#xff0c;实现了 "一次开发&#xff0c;多端部署" 的跨设备协同能力。其核心优势在于&#xff1a; 弹性部署架构&#xff1a;一套系统…...

el-select 可搜索下拉框 在ios、ipad 无法唤出键盘,造成无法输入

下一篇&#xff1a;el-select 可搜索下拉框&#xff0c;选中选项后&#xff0c;希望立即失去焦点&#xff0c;收起键盘&#xff0c;执行其他逻辑 【效果图】&#xff1a;分组展示选项 >【去界面操作体验】 首先&#xff0c;通过 夸克浏览器的搜索: el-select 在 ipad 输入框…...

深度剖析:域名与DNS安全的全方位解读

导语 在互联网的庞大体系中,域名如同我们访问网络资源的“门牌号”,而DNS则像是将门牌号翻译为具体地址的“翻译官”。然而,这看似平常的域名与DNS系统,却面临着诸多安全风险。一旦遭受攻击,可能导致网站无法访问、用户数据泄露等严重后果。了解域名与DNS安全知识,对保障…...

使用ZMQ和protobuf实现C++程序与Python程序的通信

文章目录 背景一 应用场景与需求二 Protobuf: 跨语言数据交换的基石三 通信方案 ZMQ (ZeroMQ) —— 高性能消息中间件四 进阶: 安全性与性能优化五 实践例子: 工厂温度监控系统5.1 场景描述5.2 Protobuf数据结构定义5.3 C数据采集与发布5.4 Python数据接收与可视化5.5 关键实现…...

Linux实现生产者消费者模型

目录 概念及优势 代码实现 概念及优势 生产者消费者模型是一种用于线程同步的模型&#xff0c;在这个模型中有两种角色&#xff0c;生产者生产数据&#xff0c;消费者消费数据。有三种关系&#xff0c;生产者与生产者&#xff0c;消费者与消费者&#xff0c;生产者与消费者。…...

AI驱动下的智能异常处置:海量多元异构数据的挑战与应对

摘要 在QCon北京会议上&#xff0c;AI驱动的智能异常处置成为焦点。会议深入探讨了平台复杂性及处理海量多元异构数据时所面临的挑战&#xff0c;特别是异常识别与根本原因定位的难题。这些挑战要求技术从业者不断优化算法&#xff0c;以提升数据处理效率和准确性。 关键词 …...

Axure设计之中继器表格——拖动列调整位置教程(中继器)

一、原理介绍 实现表格列的拖动排序&#xff0c;主要依赖Axure的动态面板和中继器两大核心功能&#xff1a; 动态面板交互控制 将表格的列标题封装在动态面板中&#xff0c;通过拖拽事件&#xff08;开始、移动、结束&#xff09;捕捉用户操作 在拖拽过程中实时计算鼠标位置&…...

基于大数据的各品牌手机销量数据可视化分析系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;各品牌手机销量数据可视化分析系统当然不能排除在外。基于大数据的各品牌手机销量数据可视化分析系统是在实际应用和软件工程的开发原理之…...

Open CASCADE学习|基于AIS_PointCloud显示点集

定义与用途 AIS_PointCloud是OpenCASCADE中用于表示和管理点云数据的类&#xff0c;能够高效地绘制大量任意彩色点集。它通过Graphic3d_ArrayOfPoints将点数据传递给OpenGL图形驱动程序&#xff0c;以将设定点绘制为“点精灵”数组&#xff0c;且点数据被打包到顶点缓冲区对象…...

c++随记

内存溢出与内存泄漏的区别 今天老师提出的概念问题&#xff0c;搜索了一下 # 内存泄漏与内存溢出的区别 内存泄漏(Memory Leak)和内存溢出(Memory Overflow/Out of Memory)是两种常见的内存相关问题&#xff0c;但它们的含义和产生原因不同&#xff1a; ## 内存泄漏 (Memor…...

GOC作业

实验室logo 题目描述 绘制烧毁实验室logo&#xff0c;它是由半径120&#xff0c;颜色6号色的空心元构成&#xff0c;中间的图案由线段长度为75&#xff0c;半径为15的实心圆构成&#xff0c;颜色从1号色开始&#xff0c;到6号色&#xff0c;如图所示 代码参考&#xff1a; …...

本地部署仓库管理工具 Gitlab 并实现外部访问

Gitlab是一款自托管的 Git 仓库管理工具&#xff0c;它提供了完整的代码管理功能&#xff0c;包括代码托管、版本控制、代码合并请求、问题追踪、持续集成等。 本文将详细的介绍如何利用 Docker 在本地部署 Gitlab 并结合路由侠实现外网访问本地部署的 Gitlab 。‌ 第一步&am…...

华鲲振宇天工TG225 B1国产服务器试装openEuler22.03 -SP4系统

今天测试了一下在华鲲振宇公司的天工TG225 B1国产服务器上进行openEuler22.03 -SP4操作系统的试装&#xff0c;本文记录整个测试过程。 一、服务器信息 1、服务器型号 Huakun TG225 B1 (D) 2、登录IPMI帐户信息 初始用户名Tech.ON 密码TianGong8000 二、磁盘RAID配置 测试…...

自然语言处理NLP-文本预处理

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;文本预处理是构建高效模型的关键步骤。原始文本通常包含噪声和不一致性&#xff0c;直接影响模型性能。通过预处理&#xff0c;可以提取结构化信息、减少计算复杂度&#xff0c;并提升模型对语义的理解能力。 一、为什…...

linux常用指令(9)

加油同志们,我们离胜利不远了,再有两天我们就可以了解完linux的一些基本常用指令了,到时我们便可以进入一些shell脚本语法了,那么话不多说,来看. 1.more指令 功能描述&#xff1a;more指令是一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容. 基本语法…...

【windows搭建lvgl模拟环境之VSCode】

搭建vscodelvgl8.3所有资料&#xff0c;0积分 通过在windows搭建LVGL模拟环境方便UI界面开发和调试&#xff0c;后续只需将相关的代码移植到项目中即可&#xff0c;方便调试&#xff0c;PC上支持下列模拟器&#xff1a; 本文说明两种方法搭建模拟器环境&#xff0c;分别采用&am…...

【BFS染色问题】P1162填涂颜色例题+核心逻辑

文章目录 【算法思路】【代码示例】 BFS处理染色问题的核心逻辑 【算法思路】 要判断一个数字 0 是否在闭合圈内&#xff0c;可以换个角度思考。不在闭合圈内的 0 是可以从方阵的边界出发&#xff0c;通过上下左右移动&#xff0c;只经过其他 0 到达的。 思路①.我们可以从方…...

【多学科稳定EI会议大合集】计算机应用、通信信号、电气能源工程、社科经管教育、光学光电、遥感测绘、生物医学等多学科征稿!

在当今科技高速发展的时代&#xff0c;多学科领域的学术交流与融合显得尤为重要。以下是稳定EI会议合集&#xff0c;涵盖计算机、信息通信、电气能源、社科经管教育、光学遥感、生物医学等多个学科领域。 会议皆已通过国际知名出版社出版审核&#xff0c;EI检索稳定&#xff0…...

ElasticSearch -- 部署完整步骤

前期准备 创建用户&#xff1a; sudo useradd hadoop sudo passwd hadoop# 密码 xxx系统层面&#xff0c;禁用内存交换 sudo swapoff -a修改 sudo vi /etc/security/limits.conf hadoop hard memlock unlimited hadoop soft memlock unlimited hadoop soft nofile 65536 had…...

医学交互作用分析步骤和目的(R语言)

医学交互作用分析的目的和用途&#xff08;R语言&#xff09; 医学交互作用分析一直是医学数据分析的组成部分&#xff0c;总结最近的一些认识。 目的&#xff1a; 在独立危险因素鉴定的研究中&#xff0c;&#xff08;独立危险因素的&#xff09;交互作用可以作为独立危险因…...

创新前沿 | 接管主机即刻增量CDP备份,高效保障接管期间业务安全!

科力锐创新前沿系列 接管主机增量CDP备份 高效保障接管业务安全 当核心系统遭遇系统故障或误操作导致数据逻辑损毁等&#xff0c;往往需要将生产业务主机接管起来&#xff0c;继续对外提供服务&#xff0c;保障业务连续性。 然而&#xff0c;你的接管主机真的安全吗?一旦接…...