【高效排查内存错误】:掌握AddressSanitizer这10个核心技巧就够了

AddressSanitizer原理解析 AddressSanitizer的原理解析 阅读详情

第一章:AddressSanitizer概述与核心价值

AddressSanitizer(简称ASan)是GCC和Clang编译器提供的运行时内存错误检测工具,能够高效捕获内存越界访问、使用已释放内存、栈溢出等常见内存安全问题。其通过插桩机制在程序编译阶段注入检测代码,并在运行时监控内存操作行为,从而定位潜在的内存破坏漏洞。

设计原理与工作机制

ASan采用影子内存(Shadow Memory)技术跟踪程序的内存状态。每8字节的程序内存由1字节的影子内存标记其是否可访问。当发生非法内存操作时,ASan根据影子内存的状态生成详细错误报告,包括错误类型、发生位置、调用栈等信息。

典型应用场景

  • 检测堆缓冲区溢出
  • 识别悬空指针使用
  • 发现栈缓冲区溢出
  • 捕捉全局缓冲区越界

启用AddressSanitizer的编译方式

在支持ASan的编译器中,只需添加编译和链接标志即可启用:
# 编译并链接时启用ASan
gcc -fsanitize=address -g -O1 -fno-omit-frame-pointer example.c -o example

# 运行程序,若存在内存错误将输出详细报告
./example
上述命令中,-fsanitize=address 启用ASan,-g 添加调试信息以便报告包含源码行号,-fno-omit-frame-pointer 确保调用栈可解析。

优势对比

特性AddressSanitizerValgrind
检测速度接近原生性能显著变慢(10-50倍)
内存开销约2倍可达20倍
支持平台Linux, macOS, Windows (部分)跨平台广泛支持
graph TD A[源代码] --> B{编译时插桩} B --> C[插入内存检查逻辑] C --> D[生成带ASan的可执行文件] D --> E[运行时监控内存访问] E --> F{发现非法操作?} F -->|是| G[输出错误报告] F -->|否| H[正常执行结束]

第二章:AddressSanitizer基础原理与运行机制

2.1 内存错误检测的底层实现原理

内存错误检测的核心在于对程序运行时内存访问行为的监控与校验。通过编译器插桩或运行时环境拦截,可捕获每一次内存读写操作。
地址边界检查机制
工具如AddressSanitizer在分配内存时,在边界插入保护页,任何越界访问都会触发段错误。例如:
int *arr = malloc(10 * sizeof(int));
arr[10] = 1; // 越界写入,被红区捕获
该代码中,系统在堆块前后添加“红区”(redzone),非法访问时通过页保护机制上报。
元数据映射表
使用影子内存(Shadow Memory)记录每字节的可用状态。下表展示映射关系:
应用内存地址影子地址值含义
0x10000已分配且可访问
0x100A-1红区,禁止访问
每次内存操作前,运行时库查询影子内存以判断合法性,实现细粒度控制。

2.2 编译时插桩与运行时拦截技术解析

在现代软件监控与性能分析中,编译时插桩和运行时拦截是实现无侵入式观测的核心手段。前者在代码构建阶段注入逻辑,后者则在程序执行过程中动态拦截调用。
编译时插桩机制
通过修改字节码或中间表示(IR),在方法入口、异常块等关键位置插入监控代码。以 Java Agent 为例:

public class MonitorTransformer implements ClassFileTransformer {
    public byte[] transform(ClassLoader loader, String className,
                            Class<?> classType, ProtectionDomain domain,
                            byte[] classBuffer) {
        // 使用 ASM 修改字节码,插入计时逻辑
        return InstrumentationUtils.insertTimingCode(classBuffer);
    }
}
该方式性能损耗低,但灵活性受限于编译期确定的逻辑。
运行时拦截技术
借助动态代理或 Hook 框架(如 Frida、Elastic APM)在方法调用时捕获上下文。其优势在于可热更新规则,适用于调试与灰度场景。
  • 编译时插桩:适合稳定、高频路径的监控
  • 运行时拦截:适用于动态调试与条件追踪

2.3 红区(Redzone)与元数据映射机制详解

在内存安全检测中,红区(Redzone)是隔离缓冲区边界的关键防护区域,用于捕获越界访问。编译器或运行时系统会在分配对象前后插入红区填充,配合元数据映射记录内存布局。
元数据映射结构
每个内存块的红区信息通过紧凑的元数据表维护:
内存地址类型大小
0x1000Redzone Start16B
0x1010User Data32B
0x1030Redzone End16B
检测触发示例

// 在堆块末尾写入将触碰红区
char *p = malloc(32);
p[32] = 'A'; // 触发红区错误
上述操作会覆盖末尾红区,ASan等工具通过影子内存比对元数据,立即捕获非法访问。

2.4 如何解读AddressSanitizer的报错输出格式

AddressSanitizer(ASan)的报错信息结构清晰,通常包含错误类型、内存访问位置和调用栈。理解其输出是快速定位内存问题的关键。
典型报错结构解析

==12345==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x7fff5f3e8ac0
READ of size 4 at 0x7fff5f3e8ac0 thread T0
    #0 0x4dd123 in copy_string(char*, char const*) example.cpp:12
    #1 0x4de456 in main example.cpp:25
    #2 0x7f8a3b2c182f in __libc_start_main libc-start.c:274
该输出表明发生堆缓冲区溢出:程序在 example.cpp 第12行尝试读取4字节数据,但地址已超出堆块边界。第一行为错误类型与地址,后续为调用栈,精确指向问题代码路径。
关键字段说明
  • ERROR类型:如 heap-use-after-free、stack-buffer-overflow,直接指明内存违规类型;
  • address:出错的内存地址,可用于判断是否合法分配区域;
  • thread T0:标识出错线程,多线程调试时尤为重要;
  • 调用栈:从下至上展示执行流,帮助回溯至源头。

2.5 实践:从零搭建AddressSanitizer检测环境

为了高效捕捉内存越界、使用释放内存等常见错误,AddressSanitizer(ASan)是C/C++开发中不可或缺的工具。本节将指导你从零配置ASan检测环境。
环境准备与编译器支持
ASan集成在GCC 4.8+和Clang 3.1+中。推荐使用Clang以获得更清晰的报错信息。首先确认编译器版本:
clang --version
确保输出版本满足要求。
编译与链接选项
启用ASan需在编译和链接时加入特定标志:
clang -fsanitize=address -fno-omit-frame-pointer -g -O1 -o app app.c
其中:
  • -fsanitize=address:启用AddressSanitizer
  • -fno-omit-frame-pointer:保留栈帧信息,提升报错可读性
  • -g:生成调试符号
  • -O1:适度优化,避免干扰检测逻辑
运行程序后,ASan将在控制台输出详细的内存错误报告,包括错误类型、堆栈回溯和内存状态。

第三章:常见内存错误类型与检测能力

3.1 堆缓冲区溢出检测实战分析

在堆内存管理中,缓冲区溢出是常见且危险的安全漏洞。通过动态分析工具和代码审计可有效识别潜在风险。
漏洞触发场景
当程序向堆分配的缓冲区写入超出其容量的数据时,会覆盖相邻内存区域,导致任意代码执行或程序崩溃。
示例代码分析

#include <stdlib.h>
#include <string.h>

int main() {
    char *buf = (char *)malloc(16);
    strcpy(buf, "This string is too long for 16 bytes"); // 溢出点
    free(buf);
    return 0;
}
上述代码中,malloc(16) 分配了16字节堆空间,但 strcpy 写入远超此长度的字符串,造成堆溢出。
检测方法对比
工具原理适用场景
AddressSanitizer插桩+红区检测开发阶段调试
Valgrind二进制插桩运行时分析

3.2 栈溢出与全局变量越界的精准定位

在嵌入式系统开发中,栈溢出与全局变量越界是引发程序崩溃的常见根源。通过合理使用编译器特性与运行时检测机制,可实现问题的精确定位。
利用GCC内置函数检测栈使用

// 启用栈保护后插入检测代码
void check_stack_usage() {
    char dummy;
    extern char __stack_start__; // 链接脚本定义的栈起始地址
    size_t used = &dummy - &__stack_start__;
    if (used > STACK_SIZE_LIMIT) {
        log_error("Stack overflow detected!");
    }
}
该函数通过比较当前栈指针与预设栈底位置,估算已用栈空间,超出阈值则触发告警。
全局变量边界检查策略
  • 使用链接器脚本隔离关键数据段
  • 在敏感变量前后填充“金丝雀”值(Canary)
  • 定期校验填充位是否被篡改
此方法能有效识别数组越界或野指针写入导致的全局变量破坏。

3.3 使用已释放内存(Use-After-Free)的捕捉策略

检测原理与常见场景
Use-After-Free 漏洞发生在程序尝试访问已被释放的堆内存区域,常导致崩溃或任意代码执行。该问题多见于对象生命周期管理不当的C/C++程序。
利用 AddressSanitizer 进行捕获
AddressSanitizer(ASan)是 LLVM/GCC 内置的内存错误检测工具,可有效识别 Use-After-Free 行为。

#include <stdlib.h>
struct Data {
    int value;
};
int main() {
    struct Data* p = (struct Data*)malloc(sizeof(struct Data));
    p->value = 42;
    free(p);
    p->value = 10;  // 触发 Use-After-Free
    return 0;
}
使用 -fsanitize=address 编译并运行,ASan 会立即报告内存访问违规,指出释放后使用的具体位置及调用栈。
缓解与防御策略
  • 启用编译器安全检测(如 ASan、UBSan)
  • 将指针在释放后置为 NULL
  • 采用智能指针(C++)或引用计数机制

第四章:高级配置与性能优化技巧

4.1 自定义屏蔽特定代码段的检测规则

在静态代码分析过程中,有时需要临时屏蔽某些代码段以避免误报。可通过注释指令实现局部规则忽略。
常用屏蔽语法示例
//nolint:govet
func problematicCode() {
    // 该函数存在字段对齐问题,但出于性能考虑保留
    type BadStruct struct {
        a int8
        b int64
    }
}
上述代码中,//nolint:govet 指令告知 linter 忽略 govet 规则对该函数的检查。参数 govet 指定被禁用的具体检测器,精确控制屏蔽范围。
多规则与全局屏蔽
  • //nolint:忽略当前函数所有警告
  • //nolint:gosec,errcheck:指定忽略多个规则
  • //nolint:unused // 忽略未使用变量:添加说明注释提升可读性

4.2 结合CMake/Makefile集成到构建系统

在现代C++项目中,将第三方库或自定义模块无缝集成到构建系统是提升开发效率的关键。使用CMake或Makefile可实现跨平台、可维护的自动化构建流程。
使用CMake链接静态库
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE mymath_static)
该代码片段将可执行文件 myapp 与名为 mymath_static 的静态库链接。PRIVATE 表示依赖关系不传递给其他目标,适用于内部依赖管理。
Makefile中的依赖规则
  • 目标(Target):指定生成文件名
  • 依赖(Prerequisites):列出需要的源文件或库
  • 命令(Commands):构建动作,如 g++ 编译
通过合理组织规则,可实现增量编译,显著提升大型项目的构建速度。

4.3 多线程环境下内存错误的识别与调试

在多线程程序中,内存错误常由竞态条件、数据竞争或不当的同步机制引发。这类问题难以复现且调试复杂,需借助工具与编码规范协同定位。
常见内存错误类型
  • 数据竞争:多个线程同时访问同一变量,至少一个为写操作,且未加同步。
  • 悬空指针:线程访问已被释放的内存区域。
  • 死锁:线程因相互等待锁而永久阻塞。
代码示例与分析

#include <pthread.h>
int data = 0;
void* thread_func(void* arg) {
    data++; // 潜在数据竞争
    return NULL;
}
上述代码中,两个线程同时执行 data++,该操作非原子性,可能导致更新丢失。应使用互斥锁保护共享变量。
调试工具对比
工具适用平台检测能力
ValgrindLinux内存泄漏、越界访问
ThreadSanitizer跨平台数据竞争、死锁

4.4 降低运行时开销:平衡性能与检测精度

在漏洞检测系统中,高精度往往伴随高昂的运行时开销。为实现性能与检测能力的均衡,需从算法优化与资源调度两方面入手。
动态采样策略
通过动态调整检测粒度,在高风险操作区域启用细粒度分析,而在常规路径中采用粗粒度扫描:
// 动态采样逻辑示例
func ShouldAnalyze(ctx *Context) bool {
    if ctx.Operation == "execve" || ctx.IsPrivileged {
        return true // 高风险操作,启用完整分析
    }
    return rand.Float64() < 0.1 // 低风险路径,10%抽样
}
该策略显著减少分析路径数量,同时保留对关键行为的监控能力。
资源消耗对比
策略CPU 增加内存占用检测召回率
全量分析~45%High98%
动态采样~12%Medium91%
通过权衡可接受的精度损失,换取系统资源的大幅节约。

第五章:总结与生产环境应用建议

配置管理的最佳实践
在大规模微服务部署中,集中式配置管理至关重要。推荐使用 HashiCorp Consul 或 Spring Cloud Config 实现动态配置刷新,避免因重启导致的服务中断。
  • 所有敏感信息应通过 Vault 进行加密存储
  • 配置变更需通过 CI/CD 流水线进行版本控制
  • 启用配置审计日志,追踪每一次修改来源
性能监控与告警策略
生产环境必须集成 Prometheus + Grafana 监控栈,采集 JVM、HTTP 请求延迟、数据库连接池等关键指标。
指标类型告警阈值处理方式
95% 请求延迟>800ms自动扩容实例
错误率>5%触发熔断并通知值班人员
高可用部署模型
跨可用区部署是保障 SLA 的基础。以下为 Kubernetes 中的 Pod 反亲和性配置示例:

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
            - key: app
              operator: In
              values:
                - user-service
        topologyKey: "kubernetes.io/hostname"
[Service A] → [API Gateway] → [Service B] ↓ [Redis Cluster] ↓ [Kafka Message Bus]
日志应统一通过 Fluent Bit 收集至 Elasticsearch,并设置基于异常关键字(如 OOM、Timeout)的自动告警规则。
Address Sanitizer(Asan)原理及实战定位 Asan ASAN(AddressSanitizer的缩写)是一款面向C/C++语言的内存错误问题检查工具,可以检测如下内存问题: 使用已释放内存(野指针) 堆内存越界(读写) 栈内存越界(读写) 全局变量越界(读写) 函数返回局部变量 内存泄漏 ASAN工具主要由两部分组成: 编译器插桩模块 运行时库 运行时库:(libasan.so.x)会接管malloc和``free函数。mal... 阅读详情

相关推荐

内存错误检测工具-AddressSanitizer(ASAN)

ASAN(Address-Sanitizier)早先是LLVM中的特性,后被加入GCC 4.8,在GCC 4.9后加入对ARM平台的支持。因此GCC 4.8以上版本使用ASAN时不需要安装第三方库,通过在编译时指定编译CFLAGS即可打开开关。 之前介绍过一款传统的内存问题检测工具Valgrind : https://blog.youkuaiyun.com/qq_15437629/article/details/79264600 用过 Valgrind 的朋友应该都清楚,其会极大的降低程序运行速度,大约降低10倍,而

造梦先森Kai的专栏 2万+

内存越界、泄漏、重复释放:用AddressSanitizer一次解决所有顽疾

快速定位C++内存问题,AddressSanitizer提供高效解决方案。作为一款强大的C++内存泄漏检测工具,AddressSanitizer可精准捕捉内存越界、泄漏与重复释放,支持GCC/Clang编译器,低开销高精度,开发调试必备,值得收藏。

FuncTide的博客 639

Linux下AddressSanitizer实战:从编译到排错,高效检测C/C++内存错误

在C/C++开发中,内存错误是导致程序崩溃和不稳定性的常见根源,例如段错误(Segmentation Fault)和内存泄漏。传统调试工具如Valgrind虽然功能强大,但因其基于指令模拟的运行方式,往往带来10到20倍的性能开销,在需要长时间运行复现的复杂场景下效率较低。AddressSanitizer(ASan)作为一种编译时插桩技术,通过维护影子内存来快速追踪内存状态,能以平均仅2倍的性能代价,实时检测缓冲区溢出、使用已释放内存(Use-after-free)等关键问题,极大提升了调试效率。其详尽的错

weixin_30660027的博客 372

AddressSanitizer使用介绍

1、关于AddressSanitizer 1.1 引言 也许很多人都听说过类似这样的一个故事:某公司的服务器每隔3个月就会毫无预兆的崩溃一次,怎么也查不出原因,为了避免崩溃可能引发的问题,只得每2个月手动重启一次服务器。在这类有些灵异的事件背后,以内存泄露为代表的一系列内存错误往往就是那个幕后黑手。 在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费

yuanbinquan的专栏 1万+

VS2019集成AddressSanitizer:C++内存错误检测实战指南

在C++开发中,内存管理是核心挑战之一,涉及堆、栈和全局变量的分配与释放。其原理在于程序运行时对内存地址的访问必须严格遵循分配边界和生命周期规则,否则会导致缓冲区溢出、释放后使用等严重错误。这类问题的技术价值在于直接影响程序的稳定性、安全性和性能,是高质量软件必须攻克的基础难题。应用场景广泛,从嵌入式系统到大型服务器软件,都需要可靠的内存错误检测机制。AddressSanitizer(ASan)作为一种编译时插桩技术,通过影子内存和运行时检查,能精准定位堆缓冲区溢出、释放后使用等隐蔽错误。本文以Visual

weixin_34356310的博客 279

C++内存泄漏排查实战:Valgrind与AddressSanitizer工具详解

内存管理是C++编程的核心基础,其核心原理在于程序运行时对堆内存的分配与释放。不当的内存管理会导致内存泄漏,即已分配的内存无法被访问和释放,长期积累将耗尽系统资源,引发程序崩溃或性能下降。从技术价值看,高效的内存泄漏排查能显著提升软件稳定性与资源利用率,是现代软件开发中保障服务质量的必备技能。在应用场景上,无论是大型服务器后端、嵌入式系统还是高性能计算领域,系统性的内存问题排查都至关重要。本文聚焦于C++开发中两大主流工具——Valgrind和AddressSanitizer,通过对比其插桩模拟与编译时检测

weixin_26911099的博客 305

【C/C++内存问题检测工具】 AddressSanitizer(Asan)介绍与分析

感谢原作者分享,转自:https://zhuanlan.zhihu.com/p/37515148 Google出品的内存检测工具AddressSanitizer介绍与分析 介绍 AddressSanitizer是Google旗下的一个内存问题检测工具,项目地址:https://github.com/google/sanitizers/wiki/AddressSanitizer 它与传统的内...

勤学如春起之苗,不见其增,日有所长! 辍学如磨刀之石,不见其损,日有所亏! 9136

C++内存检测利器AddressSanitizer:原理、配置与实战指南

内存管理是C++开发中的核心挑战,内存错误如缓冲区溢出、使用已释放内存等常导致程序崩溃或安全漏洞。AddressSanitizer(ASan)作为编译时插桩工具,通过影子内存和红区机制,在运行时以约2倍性能开销动态检测数十类内存问题。其技术价值在于将传统需要数天调试的幽灵Bug转化为即时可定位的错误报告,极大提升了开发效率。在应用场景上,ASan已集成到主流编译器(GCC、Clang、MSVC),支持Linux与Windows平台,并可无缝融入CI/CD流程,实现自动化内存安全测试。本文聚焦ASan的核心原

weixin_33739646的博客 400

【C++内存调试神器】:彻底掌握AddressSanitizer高效排查内存错误

快速定位C++内存错误,提升程序稳定性。本文深入讲解C++ AddressSanitizer 的使用方法,覆盖内存越界、野指针等常见问题的检测场景,结合编译选项与运行时分析,实现高效调试。支持GCC/Clang,无需第三方工具,显著提升开发效率。值得收藏,点击了解实战技巧。

BytePerch的博客 332

内存错误检测的工程实用指南

AddressSanitizer (ASan) 是 Google 开发的高效内存错误检测工具,通过编译时插桩和影子内存机制,实时监控 C/C++ 程序的内存访问行为。其核心原理是将 8 字节用户内存映射为 1 字节影子内存,标记状态(如合法、红区、已释放),快速捕捉越界、泄漏、双重释放等错误。使用时需添加 -fsanitize=address 编译选项,并通过环境变量配置检测范围。ASan 能精准定位堆/栈溢出、Use-After-Free、非法释放等常见问题,输出详细错误类型、调用栈及源代码位置。

硬核科技 1259

世界模型和大语言模型结合开发自动驾驶算法

摘要:自动驾驶系统开发中,融合世界模型和大语言模型可显著提升效率和安全性。世界模型负责环境感知与预测(如目标检测、轨迹预测),而大语言模型优化代码生成、决策解释等环节。实施路径包括需求分析(1-2周)、模型开发(2-4个月)、模拟测试(1-2个月)、实车测试(2-3个月)和合规优化(1-2个月),总周期6-12个月。关键技术工具包括PyTorch/TensorFlow、CARLA模拟器和ROS系统,核心设计理念强调模块化、安全优先和敏捷迭代。示例代码展示了YOLO目标检测与大语言模型决策建议的集成方案。该方

ponygame的博客 826

使用AddressSanitizer检测C++程序中的内存错误

使用ASAN_OPTIONS=allocator_may_return_null=1可加速分配失败处理,适用于高频分配场景。开启detect_leaks=1可检测内存泄漏,halt_on_error=0允许程序在错误后继续运行以捕获更多问题。设置ASAN_OPTIONS=detect_data_race=1可检测线程竞争条件,但会增加约30%运行时开销。ARM64平台需额外设置ASAN_OPTIONS=quarantine_size_mb=128以降低内存消耗。二、环境配置与编译选项。

2301_76383677的博客 976

概率的接力:拆解大模型“预测下一个词“的底层逻辑

大模型的智能不在于它拥有了意识,而在于它用纯数学的架构,将人类语言的复杂结构压缩为可计算的向量轨迹与概率接力。当我们不再将其拟人化为"思考者",而是视作高维条件概率引擎时,才能真正驾驭它。预测下一个词,从来不是终点,而是起点。未来的核心竞争力,属于那些能洞察其统计本质、善用其模式生成能力,并以人类理性与事实为锚点的协作者。词元的轨迹终会止步于上下文窗口,但对技术底层的清醒认知,才是跨越幻觉、走向真实智能的基石。

AI浩 330

为什么顶尖公司都在用AddressSanitizer?,揭秘高效内存错误检测内幕

掌握C++ AddressSanitizer 的使用,快速定位内存越界、野指针等顽固问题。适用于高频交易、游戏引擎等对稳定性要求极高的场景,编译时启用即可实时检测,大幅缩短调试周期。高效精准,已被多家顶尖公司广泛采用。值得收藏

LearnFlow的博客 426

Node-RED系列(二九):使用slider与chart节点来实现双折线时间序列图

今天教使用dashboard的chart组件和slider组件来是实现一个双线的折线图。效果如下 拖动顶部的电量和水量,低下的图表会实时显示时间和值之所以做这个模拟案例,是将教 大家使用chart节点和slider节点先说一下slider节点,该节点是一个滑块节点,可以接受上一节点的 msg.payload,作为滑块的值, slider必须设置最大值和最小值。且不能动态设置。 此外当用户拖动slider滑块,改变值时,该节点会向下传递当前值 以属性payload装载。在说一下chart节点,该节点可以用于

知无涯 4968

Codex、Claude Code、Opus、Trae、Cursor:一文讲懂 2026 AI 编程工具格局

2026年AI编程工具将形成三层体系:模型层(Opus/Codex)负责思考,执行层(Claude Code/Codex Agent)负责自动开发任务,工具层(Cursor/Trae)提供AI集成的开发环境。关键区别在于Agent路线强调AI主导自动化开发,而IDE路线保持人类主导。未来竞争力取决于能否将AI整合为生产力系统,掌握模型推理、Agent任务编排和AI IDE协同三大能力。核心转变是从"写代码"升级为"指挥AI写代码",高级玩家通过组合不同层级工具构建自动

m0_51738372的博客 2692

揭秘AddressSanitizer内存泄漏检测机制:如何在生产环境中高效排查隐性泄漏?

掌握AddressSanitizer的泄漏检测技巧,快速定位C/C++程序中的隐性内存泄漏。适用于生产环境下的高精度排查,支持实时检测与低开销运行,显著提升调试效率。原理清晰、配置灵活,是开发者的得力工具。值得收藏

AlgoChat的博客 457

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。  通过博文了解💝💝💝    1💝💝💝----adb禁用或者删除系统app导致无法开机的几种解决方法 2💝💝💝----如何保数据来无损恢复机型 3💝💝💝----其他保数据解决系统类故障无法开机的步骤解析

小马哥的专栏 1352

GDB调试实战:利用ASan高效检测C++内存错误

本文详细介绍了如何利用ASan(AddressSanitizer)结合GDB高效检测C++内存错误,包括内存泄漏、堆溢出、栈溢出等常见问题。通过实战案例和配置技巧,帮助开发者快速定位和修复内存相关错误,提升代码质量和稳定性。

weixin_30687051的博客 468

禾赛激光雷达AT128P/海康相机(1):ROS环境设备驱动

sudo cp *.so /opt/MVS/lib/64/ # 复制当前文件夹中所有.so文件 到 “/opt/MVS/lib/64/” 文件中。将相应的.so文件复制到 /opt/MVS/lib/64/。我解压的是x86_64的,解压之后,打开,再解压MVS。然后在上一层,也就是选择x86_64那一层打开终端。新建一个工作空间,或者打开自己的工作空间。)包放在src内,并解压,然后编译。MVS V2.1.2下载之后解压,// 驱动代码下载到src文件里面。// 特定文件夹中打开终端。

努力努力努力 882

MIKE水动力笔记4_制作网格

建立水动力模型前的重要一步就是制作网格,本文所讲内容就是如何在MIKE中制作网格。

晏长街的博客 2万+

揭秘C++内存泄漏难题:如何用AddressSanitizer在5分钟内定位并修复

快速解决C++内存泄漏难题,揭秘高效调试方法。本文介绍如何使用C++内存泄漏检测工具AddressSanitizer,在5分钟内精准定位并修复常见内存问题,适用于Linux/Windows开发环境,编译时启用即可实时检测。操作简单、零侵入,提升代码稳定性,值得收藏。

QuickTrans的博客 462

让 ABAP 程序天生可翻译:Text Symbols 与 Text Pool 从入门到工程化落地

ABAP 国际化实践:Text Symbols 的工程价值与落地方法 摘要: 本文系统阐述了 ABAP 开发中 Text Symbols 的核心价值与实践方法。通过解耦程序逻辑与语言文本,Text Symbols 实现了代码国际化,避免了硬编码带来的维护难题。文章详细介绍了 Text Pool 结构、两种引用方式(独立引用 TEXT-001 和附着式 '(001)'),以及 SE38 和 SE63 的翻译流程。特别强调最大长度预留、术语统一等工程实践,并提供了 READ TEXTPOOL 自动化检查方案。最

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 238

C++内存泄漏高效定位与排查指南

摘要: 本文系统介绍了C++内存泄漏的排查方法,从泄漏分类(常发性/偶发性/隐式/一次性)到核心成因(未释放、异常分支、循环引用)。工具链涵盖静态检测(Cppcheck、Clang-Tidy)和动态分析(Valgrind、ASan、VS CRT),重点对比了Linux/Windows平台工具特性。代码级优化建议包括智能指针、重载new运算符追踪及CI集成检测,并给出四步排查流程:复现→选工具→分析→验证。最后总结工具选型矩阵,强调RAII优先原则和自动化检测必要性,附Valgrind/ASan实践链接。

半青年的博客 1049

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

AddressSanitizer排查PyTorch自定义算子越界访问

在开发PyTorch自定义C++算子时,内存越界常导致隐蔽崩溃。AddressSanitizer通过编译插桩和影子内存技术,能精准捕获堆栈溢出等错误,结合Clang编译与调试符号,快速定位到具体行号。尤其在CUDA镜像环境中,配合cuda-memcheck可覆盖主机与设备端检测,显著提升底层算子稳定性。

weixin_42577735的博客 852

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Clang内存泄漏检测终极指南】:掌握C语言高效排查技巧,告别程序崩溃

掌握Clang C语言内存泄漏检测技巧,快速定位并修复程序崩溃问题。适用于Linux/Unix系统开发,结合静态分析与AddressSanitizer实现精准排查,提升代码稳定性。方法简单高效,值得收藏。

BreakNexus的博客 723

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 【C++类静态成员函数访问权限深度解析】:掌握99%程序员忽略的关键细节
下一篇: std::call_once深度剖析:从源码到实践,彻底搞懂C++线程安全初始化机制
FuncFun
博客等级 码龄1年 133粉丝 1996原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值