NDK (C++) 开发中如何使用 ASan 检测内存越界、溢出等内存错误

高通车机8155平台android开启ASAN定位内存问题方法 通8155p平台QNX+Android9开启ASAN定位内存问题方法Android.mk与Android.bp都有 阅读详情

NDK (C++) 开发中如何使用 ASan 检测内存越界、溢出等内存错误

该文章首发于微信公众号:字节流动

什么是 ASan

ASan 是 Address Sanitizer 简称,它是是一种基于编译器用于快速检测原生代码中内存错误的工具。

简而言之,ASan 就是一个用于快速检测内存错误的工具。这里很多朋友有误解,ASan 其实并不能用于内存泄漏检测,Android 平台内存泄漏检测推荐 MallocDebug 。

另外需要注意的是 Android O(API >= 27)及以上版本才支持 ASan ,NDK 需要选用 r20 及以上版本。

ASan 可以检测到内存错误类型如下:

  • Stack and heap buffer overflow/underflow 栈和堆缓冲区上溢/下溢;
  • Heap use after free 堆内存被释放之后还在使用其指针;
  • Stack use outside scope 在某个局部变量的作用域之外,使用其指针;
  • Double free/wild free 指针重复释放的情况。

ASan 支持 arm 和 x86 平台,使用 ASan 时,APP 性能会变慢且内存占用会飙升。针对 arm64 平台,Android 官方推荐使用 HWAddress Sanitizer (HWASan),后面会介绍。

关于 ASan 的原理本文不做深入讨论,该文章的主要目的是帮助开发者快速上手 ASan 的使用。

这里感性地介绍下 ASan 的工作原理:ASan 相当于接管了内存的分配,当分配一块内存时,会在这块内存的前后添加"标志位",然后再次使用该内存的时候检查"标志位"是否被修改,当发现"标志位"被修改时,判断出现内存错误。

怎么使用 ASan

之所以写这篇文件,就是因为发现一些文章介绍 ASan 使用方法搞得非常复杂,不易上手。

其实 Android 官方的使用说明非常简洁,就是复制黏贴,添加两行代码就搞定。

官方文档:https://developer.android.com/ndk/guides/asan

修改编译脚本

CMake

APP 下面的 build.gradle 添加:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                # Can also use system or none as ANDROID_STL.
                arguments "-DANDROID_ARM_MODE=arm", "-DANDROID_STL=c++_shared"
            }
        }
    }
}

CMakeLists.txt 脚本添加:

target_compile_options(${libname} PUBLIC -fsanitize=address -fno-omit-frame-pointer)
set_target_properties(${libname} PROPERTIES LINK_FLAGS -fsanitize=address)

NDK-BUILD

Application.mk 文件添加:

APP_STL := c++_shared # Or system, or none.
APP_CFLAGS := -fsanitize=address -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=address

Android.mk 文件添加:

APP_STL := c++_shared # Or system, or none.
APP_CFLAGS := -fsanitize=address -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=address

拷贝 Asan 库到 jniLibs 目录下

Asan 库位于下面路径下:

android-ndk-r21\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\9.0.8\lib\linux

64 位 libclang_rt.asan-aarch64-android.so , 32 位 libclang_rt.asan-arm-android.so ,分别拷贝两个库到 jniLibs 相应的目录下。

新建 wrap.sh 文件,拷贝下面内容到文件中:

#!/system/bin/sh
HERE="$(cd "$(dirname "$0")" && pwd)"
export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1
ASAN_LIB=$(ls $HERE/libclang_rt.asan-*-android.so)
if [ -f "$HERE/libc++_shared.so" ]; then
    # Workaround for https://github.com/android-ndk/ndk/issues/988.
    export LD_PRELOAD="$ASAN_LIB $HERE/libc++_shared.so"
else
    export LD_PRELOAD="$ASAN_LIB"
fi
"$@"

在 main 文件夹下新建目录 resources\lib 然后将 wrap.sh 文件拷贝到相应的目录下面,最终的目录结构是这样的:

<project root>
└── app
    └── src
        └── main
            ├── jniLibs
            │   ├── arm64-v8a
            │   │   └── libclang_rt.asan-aarch64-android.so
            │   ├── armeabi-v7a
            │   │   └── libclang_rt.asan-arm-android.so
            │   ├── x86
            │   │   └── libclang_rt.asan-i686-android.so
            │   └── x86_64
            │       └── libclang_rt.asan-x86_64-android.so
            └── resources
                └── lib
                    ├── arm64-v8a
                    │   └── wrap.sh
                    ├── armeabi-v7a
                    │   └── wrap.sh
                    ├── x86
                    │   └── wrap.sh
                    └── x86_64
                        └── wrap.sh

自此 ASan 接入完成,是不是很简单?

ASan 检测内存错误

这一节我们在代码中故意设置一些常见的内存错误(内存越界等)用来测试 ASan 检测出来的结果是否正确。需要注意的是,当 ASan 检测出内存错误,程序就会立即 crash ,不再往下执行,log 中会出现关键字 AddressSanitizer 。

堆内存溢出

static void HeapBufferOverflow() {
    int *arr = new int[1024];
    arr[0] = 11;
    arr[1024] = 12;
    LOGCATE("HeapBufferOverflow arr[0]=%d, arr[1024]",arr[0], arr[1024]);
}

ASan 检测结果(crash log)中出现关键字 heap-buffer-overflow :

05-13 19:52:16.247  4194  4194 I com.byteflow.learnffmpeg: =================================================================
05-13 19:52:16.247  4194  4194 I com.byteflow.learnffmpeg: ==4194==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x004f0d5a8100 at pc 0x0074f822b648 bp 0x007ff0227a00 sp 0x007ff02279f8
05-13 19:52:16.247  4194  4194 I com.byteflow.learnffmpeg: WRITE of size 4 at 0x004f0d5a8100 thread T0
05-13 19:52:16.257 23334 23334 D Launcher_UnlockAnimationStateMachine: mResetIdleStateRunnable
05-13 19:52:16.265  4194  4194 I com.byteflow.learnffmpeg:     #0 0x74f822b644  (/data/app/com.byteflow.learnffmpeg-mVg7CcQSTXVnJhfo7u0XLA==/lib/arm64/liblearn-ffmpeg.so+0x146644)
05-13 19:52:16.265  4194  4194 I com.byteflow.learnffmpeg:     #1 0x74f8229b20  (/data/app/com.byteflow.learnffmpeg-mVg7CcQSTXVnJhfo7u0XLA==/lib/arm64/liblearn-ffmpeg.so+0x144b20)
05-13 19:52:16.265  4194  4194 I com.byteflow.learnffmpeg:     #2 0x74f8229a7c  (/data/app/com.byteflow.learnffmpeg-mVg7CcQSTXVnJhfo7u0XLA==/lib/arm64/liblearn-ffmpeg.so+0x144a7c)
05-13 19:52:16.265  4194  4194 I com.byteflow.learnffmpeg:     #3 0x74fdaac0a0  (/data/app/com.byteflow.learnffmpeg-mVg7CcQSTXVnJhfo7u0XLA==/oat/arm64/base.odex+0xb0a0)
05-13 19:52:16.265  4194  4194 I com.byteflow.learnffmpeg: ........

栈内存溢出

 //stack-buffer-overflow
 static void StackBufferOverflow() {
     int arr[1024];
     arr[0] = 11;
     arr[1024] = 12;
     LOGCATE("StackBufferOverflow arr[0]=%d, arr[1024]",arr[0], arr[1024]);
 }

ASan 检测结果(crash log)中出现关键字 stack-buffer-overflow :

05-13 19:54:30.371  5002  5002 I com.byteflow.learnffmpeg: =================================================================
05-13 19:54:30.371  5002  5002 I com.byteflow.learnffmpeg: ==5002==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x007ff02278c0 at pc 0x0074f8bd6640 bp 0x007ff0226890 sp 0x007ff0226888
05-13 19:54:30.372  5002  5002 I com.byteflow.learnffmpeg: WRITE of size 4 at 0x007ff02278c0 thread T0
05-13 19:54:30.389  5002  5002 I com.byteflow.learnffmpeg:     #0 0x74f8bd663c  (/data/app/com.byteflow.learnffmpeg-aaLGh4G_-2c2WC7sX0ibag==/lib/arm64/liblearn-ffmpeg.so+0x14663c)
05-13 19:54:30.389  5002  5002 I com.byteflow.learnffmpeg:     #1 0x74f8bd4a20  (/data/app/com.byteflow.learnffmpeg-aaLGh4G_-2c2WC7sX0ibag==/lib/arm64/liblearn-ffmpeg.so+0x144a20)
05-13 19:54:30.389  5002  5002 I com.byteflow.learnffmpeg:     #2 0x74f8bd497c  (/data/app/com.byteflow.learnffmpeg-aaLGh4G_-2c2WC7sX0ibag==/lib/arm64/liblearn-ffmpeg.so+0x14497c)
......

使用已释放的指针

//heap-use-after-free
static void UseAfterFree() {
    int *arr = new int[1024];
    arr[0] = 11;
    delete [] arr;
    LOGCATE("UseAfterFree arr[0]=%d, arr[1024]",arr[0], arr[1024]);
}

ASan 检测结果(crash log)中出现关键字 heap-use-after-free :

05-13 19:56:44.430  5235  5235 I com.byteflow.learnffmpeg: =================================================================
05-13 19:56:44.430  5235  5235 I com.byteflow.learnffmpeg: ==5235==ERROR: AddressSanitizer: heap-use-after-free on address 0x004f0d5a7100 at pc 0x0074f7ac945c bp 0x007ff02279d0 sp 0x007ff02279c8
05-13 19:56:44.430  5235  5235 I com.byteflow.learnffmpeg: READ of size 4 at 0x004f0d5a7100 thread T0
05-13 19:56:44.447  5235  5235 I com.byteflow.learnffmpeg:     #0 0x74f7ac9458  (/data/app/com.byteflow.learnffmpeg-w2WNuKKPLEj7i4_8_Oj3Sw==/lib/arm64/liblearn-ffmpeg.so+0x146458)
05-13 19:56:44.448  5235  5235 I com.byteflow.learnffmpeg:     #1 0x74f7ac7920  (/data/app/com.byteflow.learnffmpeg-w2WNuKKPLEj7i4_8_Oj3Sw==/lib/arm64/liblearn-ffmpeg.so+0x144920)
05-13 19:56:44.448  5235  5235 I com.byteflow.learnffmpeg:     #2 0x74f7ac787c  (/data/app/com.byteflow.learnffmpeg-w2WNuKKPLEj7i4_8_Oj3Sw==/lib/arm64/liblearn-ffmpeg.so+0x14487c)
......

局部变量的作用域之外使用其指针

//stack-use-after-scope
static int *p;
static void UseAfterScope()
{
    {
        int a = 0;
        p = &a;
    }
    *p = 1111;
    LOGCATE("UseAfterScope *p=%d",*p);
}

ASan 检测结果(crash log)中出现关键字 stack-use-after-scope :

https://developer.android.com/ndk/guides/asan#cmake05-13 20:01:19.447  5907  5907 I com.byteflow.learnffmpeg: =================================================================
05-13 20:01:19.447  5907  5907 I com.byteflow.learnffmpeg: ==5907==ERROR: AddressSanitizer: stack-use-after-scope on address 0x007ff02279a0 at pc 0x0074f8236438 bp 0x007ff0227970 sp 0x007ff0227968
05-13 20:01:19.448  5907  5907 I com.byteflow.learnffmpeg: WRITE of size 4 at 0x007ff02279a0 thread T0
05-13 20:01:19.462 23334 23334 D Launcher_UnlockAnimationStateMachine: mResetIdleStateRunnable
05-13 20:01:19.464  5907  5907 I com.byteflow.learnffmpeg:     #0 0x74f8236434  (/data/app/com.byteflow.learnffmpeg-jx_Xi14rwGHag_VZ9KWXYA==/lib/arm64/liblearn-ffmpeg.so+0x146434)
05-13 20:01:19.465  5907  5907 I com.byteflow.learnffmpeg:     #1 0x74f8234860  (/data/app/com.byteflow.learnffmpeg-jx_Xi14rwGHag_VZ9KWXYA==/lib/arm64/liblearn-ffmpeg.so+0x144860)
05-13 20:01:19.465  5907  5907 I com.byteflow.learnffmpeg:     #2 0x74f82347bc  (/data/app/com.byteflow.learnffmpeg-jx_Xi14rwGHag_VZ9KWXYA==/lib/arm64/liblearn-ffmpeg.so+0x1447bc)
05-13 20:01:19.465  5907  5907 I com.byteflow.learnffmpeg:     #3 0x74fdabe0a0  (/data/app/com.byteflow.learnffmpeg-jx_Xi14rwGHag_VZ9KWXYA==/oat/arm64/base.odex+0xb0a0)
.....

重复释放指针

//double-free
static void DoubleFree() {
    int *arr = new int[1024];
    arr[0] = 11;
    delete [] arr;
    delete [] arr;
    LOGCATE("UseAfterFree arr[0]=%d",arr[0]);
}

ASan 检测结果(crash log)中出现关键字 double-free :

05-13 20:02:16.474  6102  6102 I com.byteflow.learnffmpeg: =================================================================
05-13 20:02:16.475  6102  6102 I com.byteflow.learnffmpeg: ==6102==ERROR: AddressSanitizer: attempting double-free on 0x004f0d5a7100 in thread T0:
05-13 20:02:16.492  6102  6102 I com.byteflow.learnffmpeg:     #0 0x74f9f2b7b0  (/data/app/com.byteflow.learnffmpeg-kjj44NZxl-eyA06gf3E2MA==/lib/arm64/libclang_rt.asan-aarch64-android.so+0xd57b0)
05-13 20:02:16.492  6102  6102 I com.byteflow.learnffmpeg:     #1 0x74f88cd210  (/data/app/com.byteflow.learnffmpeg-kjj44NZxl-eyA06gf3E2MA==/lib/arm64/liblearn-ffmpeg.so+0x146210)
05-13 20:02:16.492  6102  6102 I com.byteflow.learnffmpeg:     #2 0x74f88cb720  (/data/app/com.byteflow.learnffmpeg-kjj44NZxl-eyA06gf3E2MA==/lib/arm64/liblearn-ffmpeg.so+0x144720)
05-13 20:02:16.492  6102  6102 I com.byteflow.learnffmpeg:     #3 0x74f88cb67c  (/data/app/com.byteflow.learnffmpeg-kjj44NZxl-eyA06gf3E2MA==/lib/arm64/liblearn-ffmpeg.so+0x14467c)
......

ASan 基本上可以覆盖到常见的内存错误问题,还有其他 Case 就不一一展示了。

技术交流

技术交流可以添加我的个人微信:Byte-Flow

联系我

【Asan】工欲善其事必先利其器——AddressSanitizer 【Asan】工欲善其事必先利其器——AddressSanitizer 背景介绍 自操作系统诞生以来,编写内存安全的代码一直是一个比较困难的问题 (另一个问题则是保证线程安全)。2004 年以来,微软安全响应中心(MSRC)已对所有报告过的微软安全漏洞进行了分类。根据他们提供的数据,所有微软年度补丁中约有 70% 是针对内存安全漏洞的修复程序。 由于 C/C++ 不是一门内存安全的语言,所以此类问题会经常遇到。而在项目开发中,相关 bug 的定位、解决速度可能影响着项目的整个进度,因此开发者们亟需一个内存检测 阅读详情

相关推荐

GWP-Asan实战:Android原生内存错误检测的线上兜底方案

在Android开发中,内存错误尤其是native层的野指针、越界读写和释放后使用问题,一直是导致崩溃和稳定性隐患的根源。传统的内存检测工具如ASan虽然精度高,但性能开销和资源占用过大,难以在生产环境落地。GWP-Asan作为一种基于概率采样的轻量级检测机制,与Scudo分配器深度结合,仅通过页保护与信号处理实现低成本的内存访问监控,性能损耗通常控制在10%以内。它能在不引入明显卡顿的前提下,将原本隐藏的越界操作直接暴露为可定位的SIGSEGV崩溃,并输出含分配栈与访问类型的诊断日志。这项技术适用于系统级

weixin_34168880的博客 341

内存泄漏检测工具asan

3.堆溢出(heap buffer overflow)。堆中存储动态申请内存,如malloc(), calloc(), new int[]等,常见情况为访问到申请内存之外的地址。2、栈溢出(Stack buffer overflow),函数中的变量,参数,引用,指针,返回地址等存储在栈中,若超出栈的容量会导致栈溢出,常见情形为递归过深或申请的数组过大。1、内存泄漏(Memory leaks),即申请的内存未释放,如上图所示。把超大静态数组/放到全局变量中或越界访问静态数组。

qq_41962968的博客 3100

Android开发者必看:HWASan真机内存检测实战指南(附ASan对比)

本文为Android开发者提供了HWASan真机内存检测的实战指南。HWASan作为AddressSanitizer的硬件辅助进化版本,利用ARM64架构特性,以极低的内存和速度开销,在Android 11+真机上高效检测堆栈溢出、释放后使用等内存错误。文章详细对比了HWASan与ASan的优劣,并给出了从环境搭建、项目集成到错误解读的完整操作流程,帮助开发者在真机环境中构建强大的内存安全防线。

weixin_29021291的博客 312

ASAN 问题总结

MemShadowshadow memory也是内存中的一块区域,但与main memory又不同,shadow memory中有元数据的思想,其中的数据存放的是 main memory 的状态信息。因此,可以将 shadow memory 看做是 main memory 的元数据,而 main memory 中存储的才是程序真正的数据。

weixin_31260305的博客 3176

Android生产环境内存检测利器:GWP-ASan原理与实战

内存安全是Android应用稳定性的基石,尤其对Native代码而言,堆内存越界与释放后使用(Use-After-Free)是导致线上偶发崩溃的主要隐患。传统的AddressSanitizer(ASan)虽检测精准,但需重编译且开销巨大,无法用于生产。GWP-ASan作为一种基于采样的守护机制,以极低开销运行在Android 11+设备上,通过哨兵页和概率采样捕获内存错误。它的技术价值在于,既保持了接近零的性能损失,又能在真实用户环境中留下宝贵的tombstone证据链,包括分配栈、释放栈与访问栈。对于系统

weixin_34208185的博客 303

android 如何分析应用的内存(十一)——ASan

因为ASan需要使用各种动态库,而这些动态库在Android设备默认是没有的。因此需要将这些动态库,放入Android设备中。自定义APP的启动过程,使用wrap.sh。使用NDK提供的脚本。方法一:使用wrap.shandroid 如何分析应用的内存(七)下面只做使用说明。在AndroidManifest.xml中添加android:debuggable=“true”在build.gradle中使用 useLegacyPackaging。见android 如何分析应用的内存(七)

安仔的博客 4888

HarmonyOS的NDK开发实战(使用ASan检查c/c++代码内存问题)

为追求C/C++的极致性能,编译器和OS(Windows/Linux/Mac)运行框架不会对内存操作进行安全检测。针对该场景,DevEco Studio集成ASan(Address-Sanitizer)为开发者提供面向C/C++的地址越界检测能力,并通过FaultLog展示错误的堆栈详情及导致错误的代码行。

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 1595

8155p车机平台ASAN内存排查实战:Android/QNX双系统配置指南

内存安全问题如堆溢出、释放后使用(UAF)和栈越界,是嵌入式开发中难以定位的顽疾,尤其在多系统异构环境下,排查效率往往很低。AddressSanitizer(ASAN)作为一种编译器插桩技术,能在运行期自动检测非法内存访问,并通过详细的调用栈定位到源码行,性能开销控制在可接受范围内,已成为Native层内存调试的利器。本文从ASAN的基本原理出发,结合高通8155p车机平台的实际工程经验,介绍如何在Android9(Android.bp/Android.mk)与QNX双系统环境中快速开启ASAN,配置构建脚

cqwmy840702的博客 508

部署 AddressSanitizer(ASan)定位内存泄漏、内存越界

它是编译器提供的一种运行时检测机制,通过插桩程序,在程序运行时监控内存访问行为,及时发现和定位内存安全问题,帮助开发者快速修复难以排查的 bug。区域,按 8:1 比例映射应用内存,并标记每个内存块的状态(有效、redzone、已释放等)。程序退出前做 GC-like 遍历,发现无法访问的 heap block 就认为是泄漏。free 后填充为不可访问 shadow 值,一旦访问即报错。# # 添加 ASan 相关 flags(必须放在最后)检测使用已释放的内存(Use-after-free)

weixin_40820983的博客 1616

Android TV远程调试全攻略:从开发者模式开启到ADB连接(附常见问题排查)

本文提供了一份详尽的Android TV远程调试实战指南,涵盖从开启开发者模式、配置网络ADB连接到高效调试与深度排错的完整流程。文章重点解析了通过Wi-Fi进行远程调试的核心步骤,并针对常见的连接失败、授权问题等提供了系统性的解决方案,旨在帮助开发者为Android TV应用开发构建稳定高效的调试环境。

1340

LTspice基础教程-024.参数扫描;step指令用法

step指令用于参数扫描,扫描步骤可以是线性的,对数的或列表。 下面介绍几种常用用法: 绘制一简单电阻分压电路,如下: 线性扫描 语法:.step param <Name> <Start Value> <Stop Value> <Increment> 例:.step param Res 20 100 20 意思是R2的阻值从20变化到100,...

gaoyong_wang的博客 3万+

内存错误排查利器 ASAN的使用,本机或者交叉编译

使用c++开发系统,代码太大,逻辑太复杂以后,碰到内存问题,如果只靠静态分析太难了。然后自己想是不是开发一个工具,监视分配的每一块内存的访问情况,然后搜了下,发现已经有了,就是ASAN。将报错信息最后一列的偏移地址,即0x开头的地址全部拷贝出来到一个文本文件addr.txt中,每个地址一行。可以使用 addr2line 或者 llvm-symbolizer.exe 定位到具体代码位置,两者都是NDK提供的工具。PC上直接执行的话,如果是本地编译,那直接可以看到崩溃的调用栈,精确到行号。

haithink的专栏 1481

RFSOC实战解析(一):深入RF Data Converter的时钟与数据接口设计

本文深入解析RFSOC中RF Data Converter的时钟与数据接口设计,涵盖GHz采样、数据流处理、时钟树同步及AXI-Stream接口实战。通过详细案例和调试技巧,帮助工程师高效配置IP核,优化ADC/DAC性能,解决跨时钟域和信号完整性等关键问题。

weixin_30955617的博客 473

Asan工具android平台部署

一.首先先了解:Android NDK编译 Application.mk APP_PROJECT_PATH 项目路径 APP_MODULES 编译模块列表 APP_OPTIM release/debug 不设则取决于manifest中的android:debuggable。 不建议设置。 APP_CFLAGS 传递给编译器的选项(C /C++),作用于所有模块 APP_CPPFLAGS 传递给编译器的选项(C++) -fexceptions

溯源守拙的博客 1462

使用AI预测彩票的架构思路

彩票是随机的数字游戏,不要过度依赖AI,本文仅供娱乐研究

淘淘小窝 9407

Python 爬虫实战:抓取应届生求职网校招岗位信息,助力学子就业

应届生求职网作为国内知名的招聘平台,汇聚了大量企业的校招岗位信息。了解这些岗位信息,对于应届毕业生制定求职策略、企业制定招聘计划以及相关就业市场分析等都具有重要意义。因此,本文将深入探讨如何运用 Python 爬虫技术从应届生求职网平台抓取校招岗位信息,为应届毕业生提供有益的就业信息支持。本文深入探究了利用 Python 爬虫技术从应届生求职网平台抓取校招岗位信息的全流程。从前期的环境搭建、模拟登录,到核心的数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。

u014481728的博客 1300

Android NDK Sanitizers 实战指南:使用 hwasan、asan 与 ubsan 检测原生代码内存错误与未定义行为

本指南以 ndk-samples 仓库中的 sanitizers 示例为核心,系统讲解如何在 Android NDK 原生代码中启用三类主流 sanitizer:硬件辅助的 AddressSanitizer(hwasan)、通用 AddressSanitizer(asan)与 Undefined Behavior Sanitizer(ubsan)。你将掌握通过 Gradle build varia

gitblog_00884的博客 371

数控系统(CNC)系列:Hurco VMX42SR_(3).控制系统硬件组成部分

控制箱是CNC系统的核心部分,负责处理所有的控制指令和数据。它通常包含主控板、电源模块、接口板等关键组件。伺服驱动器是CNC系统中的关键组件,负责将主控板发出的控制信号转换为电机所需的驱动电流。它通过闭环控制确保电机的精确运动。电机是CNC系统中的执行机构,负责实现主控板发出的运动指令。常见的电机类型包括步进电机和伺服电机。传感器是CNC系统中的重要组件,用于检测和反馈机床的运行状态。常见的传感器类型包括位置传感器、速度传感器、温度传感器等。电源供应系统为CNC系统的所有组件提供电力。主电源。

2401_87715305的博客 1279

GWP-ASan:生产环境常驻的采样内存错误检测器,让偶发SIGSEGV现形

在Android Native开发中,内存错误导致的SIGSEGV崩溃往往随机、偶发且难以复现。传统ASan检测能力强,但性能开销大、内存占用高,无法部署到生产环境。GWP-ASan作为一种面向生产环境的采样式内存错误检测器,通过保护池、随机偏移和释放后隔离队列,以极低的性能代价捕获堆越界、释放后使用等问题。它无需编译器插桩,可在用户版本中常驻运行,为线上App提供一道轻量级内存安全防线。针对本地复现困难、线上无法埋点的痛点,GWP-ASan能提供包含分配栈和释放栈的完整崩溃报告,有效定位偶发SIGSEGV

weixin_34391445的博客 365

Vue2 - 最新实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)vue天地图切换视图显示改成卫星风格,切换地图图层完整代码

vue2,nuxt2,天地图,视图,卫星,地图类型切换,vue天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,vue中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue安装集成天地图详细示例源码,切换地图的样式,在天地图中如何将地图的类型随意更换,提供多种视图模式用户自由点击更换,VUE引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue2卫星天地图,能改地图的显示方式,图层类型

🏆 前端领域优质创作者 4140

【Python_PySide6学习笔记(二十四)】菜单栏QMenuBar类的基本用法

此篇文章中介绍 PySide6 中 QMenuBar 类的基本用法,包括"创建菜单栏"、"创建一级菜单"、"创建二级菜单"等,会持续更新,有需要的读者可以点赞收藏,也欢迎在评论区进行讨论。

禾戊之昂的博客 1623

Android应用程序 c/c++ 崩溃排查流程二——AddressSanitizer工具使用

摘要:本文介绍了在Android应用中集成AddressSanitizer(ASan)工具来检测C/C++内存问题的方法。针对Scudo内存分配器检测到的内存块头部损坏问题,文章详细说明了ASan工具的集成步骤:修改AndroidManifest.xml和gradle配置,添加wrap.sh脚本,以及集成ASan动态库。最后展示了如何使用ASan日志和addr2line工具定位具体的内存错误位置,如检测到试图释放栈上局部变量的无效操作。该方法能有效帮助开发者诊断内存越界写入、释放已释放内存等常见问题。

龚礼鹏的博客 1431

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

asan简单介绍

asan简单介绍

kv110的专栏 1024

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

使用AddressSanitizer检测内存错误

自己的Android 反外挂SDK,主要还是cpp代码,对自己的代码还是不太放心,还是找个工具测试测试 环境 windows 10 + Android Studio 4.0 + ndk r18b + MIX3 API28 root / Pixel2 API27 root 配置 1.模块的 build.gradle 中配置自己CMake参数 cmake{ arguments "-DANDROID_ARM_MODE=arm", "-DANDROID_STL=c++_shared", "-DANDR

键盘的起始页 1225

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TCMalloc GWP-ASan 实战指南:用低开销采样检测生产环境的堆越界与 Use-After-Free

GWP-ASan 是 Google TCMalloc 内置的一种基于采样的低开销内存错误检测工具,专为在生产环境中发现堆缓冲区溢出(heap-buffer-overflow)和释放后使用(heap-use-after-free)而设计。本指南以 TCMalloc 官方文档 [docs/gwp-asan.md](https://link.gitcode.com/i/1f1ae915f8ffd86da

gitblog_00495的博客 158

破解原生黑盒:Android NDK 调试终极指南——从崩溃分析到性能调优的全链路实战

本文系统介绍Android NDK原生代码调试的核心技术与工具链。主要内容包括:1)理解SIGSEGV等常见崩溃类型及日志来源;2)使用ndk-stack和llvm-symbolizer进行符号化解析;3)LLDB交互式调试与Android Studio集成调试;4)AddressSanitizer内存错误检测实战;5)JNI调试、多线程调试等高级技巧。文章还总结了常见陷阱的解决方案,并建议生产环境集成Firebase Crashlytics进行崩溃监控。通过掌握这些调试技术,开发者可以有效定位和修复nat

聚焦前沿科技与硬核技术底层拆解,深耕 AI、量子计算、WebAssembly 等核心领域,拒绝碎片化科普。以通俗语言讲透复杂原理,用干货内容拆解技术逻辑,助力从业者吃透核心、把握趋势,每篇都是可落地的深度技术沉淀。 1272
上一篇: FFmpeg 开发(13):Android FFmpeg 流媒体边播放边录制功能
下一篇: Android Studio 自定义快捷键调用外部程序
字节流动
字节流动 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄11年 1912粉丝 168原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节流动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值