内存访问错误解决案例(转)

内存访问错误 大内高手—常见内存错误   随着诸如代码重构和单元测试等方法引入实践,调试技能渐渐弱化了,甚至有人主张废除调试器。这是有道理的,原因在于调试的代价往往太大了,特别是调试系统集成之后的BUG,一个BUG花了几天甚至数周时间并非罕见。   而这些难以定位的BUG基本上可以归为两类:内存错误和并发问题。而又以内存错误最为普遍,即使是久经沙场的老手,也有时也难免落入陷阱。前事不忘,后世之师,了解这 阅读详情

前两天和鞠总一起成功解决了一个加密锁服务程序的内存访问错误。对于内存访问错误,我们以前一直认为难以定位而置之不理,其实要是好好跟踪分析一下,还是有可能解决的。在这里把解决过程描述一下,希望对大家以后处理类似问题有些帮助。

硬件环境
TEST(192.168.0.3), PIII 700, 512M, Morrowsoft USB Lock Installed

软件环境
Windows 2000 Server, SQL Server 2000, LinkWorks 2.4 SP2, LinkProject 2.1, MRLock Server

背景说明
鞠总十一期间对加密锁驱动程序 MrDriver.dll 进行了若干改进,解决了当被加密软件与加密锁服务分别以服务方式和普通方式启动时,无法读写对方共享内存的问题。为了兼容以前的软件,在加密锁服务程序 MrLocks.exe 中增加了版本判断,根据客户端连接使用的加密锁驱动版本来决定使用哪种方式通讯。

错误现象
更新 TEST 机上的加密锁服务和加密锁驱动后,正常运行了两三天,但突然出现了内存访问错误(如图所示),导致加密锁服务异常退出,所有加密软件都因为无法连接到加密锁而弹出了加密锁连接对话框。LinkWorks 和 LinkProjects 都停止了运行。

错误分析
以前我们遇到这种内存访问错误,是很难定位的,一般会通过写错误日志,弹出调试信息对话框等方式来确定错误位置,但这种方式只适用于可以较快重现的错误。这次遇到加密锁服务错误后,再想重现却一直不出了,说明这个错误只在某种特定条件下才会出现,而我们现在很难确定是什么操作导致了这个错误。

初步尝试
我们唯一知道的信息就是出错地址,从图上看到错误地址是“0x00405529”,于是萌生了用反汇编工具查找错误位置的想法。我以前经常用 Borland Turbo Debugger 破解一些没有源码的 Delphi 控件,去掉讨厌的试用对话框,所以这次首先尝试了 Turbo Debugger。使用 TD32 加载 mrlocks.exe 后,输入偏移地址“00405529”,定位到的汇编码是

:00405528  EF          out dx,ax
:00405529  AD          lodsd
:0040552A  267676      jbe es:MRLOCKS.004055A3

从这段代码及其上下文中,我们看不出任何端倪,不过用 ULTRA EDIT 32 查看 mrlocks.exe,只搜索到了一处“EFAD”的十六进制码,于是让鞠总尝试将代码一段段注释编译,看注释掉哪段代码后不再出现“EFAD”。但马上发现,其实只要用 ASPACK 压缩过的文件,就会出现一个“EFAD”。这说明我们直接打开 exe 文件后看到的汇编码是不对的,因为已经被 ASPACK 封装过了。要看到实际的执行代码,必须去查看 exe 文件运行起来后加载到内存里的代码才行。

再次尝试
从网上检索反汇编工具,下载了一个比较有名的 W32Dasm。先运行 mrlocks.exe,然后运行 W32Dasm,选择“附加到一个活动的进程”,附加到 mrlocks.exe 上去,W32Dasm 经过一通分析,就将 mrlocks.exe 的内存执行代码都搞出来了。执行“转到地址”命令,输入发生错误的偏移地址“00405529”,W32Dasm 就定位到如下代码段

   :004054BE nop
   :004054BF nop
   :004054C0 sub esp, 0000001C
   :004054C3 mov dword ptr [esp], ecx
   :004054C7 push ebx
   :004054C8 mov ecx, dword ptr [esp+2C]
   :004054CC push ebp
   :004054CD push esi
   :004054CE cmp ecx, 00000100
   :004054D4 push edi
   :004054D5 jg 004055BD
   :004054DB lea eax, dword ptr [ecx+07]
   :004054DE mov esi, dword ptr [esp+34]
   :004054E2 cdq
   :004054E3 and edx, 00000007
   :004054E6 mov edi, 0043643C
   :004054EB add eax, edx
   :004054ED mov ebp, eax
   :004054EF mov eax, ecx
   :004054F1 shr ecx, 02
   :004054F4 repz
   :004054F5 movsd
   :004054F6 mov ecx, eax
   :004054F8 and ecx, 00000003
   :004054FB sar ebp, 03
   :004054FE repz
   :004054FF movsb
   :00405500 shl ebp, 03                     (源码在这里有个乘 8 的操作)
   :00405503 call MSVCRT.rand                (这个 API 调用为定位源码位置有很大帮助)
   :00405509 mov cl, byte ptr [0042DCA1]
   :0040550F mov ebx, dword ptr [esp+30]
   :00405513 cmp cl, 04                      (这里就是判断软件所使用驱动版本的地方)
   :00405516 jnb 0040552D                    (如不低于 4,即使用的是最新驱动,应该跳离)
   :00405518 mov edx, dword ptr [esp+10]
   :0040551C and ebx, 0000FFFF
   :00405522 mov ecx, dword ptr [edx+4*ebx+00000138]
 * :00405529 mov dword ptr [ecx], eax        (出错点,本机使用的是最新驱动,代码不应该走到这里的)
   :0040552B jmp mrlocks.00405540
   :0040552D mov edx, dword ptr [esp+10]     (>=4)
   :00405531 and ebx, 0000FFFF
   :00405537 mov ecx, dword ptr [edx+4*ebx+000002C8]
   :0040553E mov dword ptr [ecx], eax
   :00405540 mov al, byte ptr [0042DCA1]
   :00405545 mov ecx, 00000006
   :0040554A mov esi, 0044538C
   :0040554F lea edi, dword ptr [esp+14]
   :00405553 cmp al, 04
   :00405555 repz
   :00405556 movsd
   :00405557 jnb 00405568
   :00405559 mov edx, dword ptr [edx+4*ebx+00000138]
   :00405560 mov eax, dword ptr [edx]
   :00405562 mov dword ptr [esp+1D], eax
   :00405566 jmp mrlocks.00405575
   :00405568 mov ecx, dword ptr [edx+4*ebx+000002C8]
   :0040556F mov edx, dword ptr [ecx]
   :00405571 mov dword ptr [esp+1D], edx
   :00405575 lea eax, dword ptr [esp+14]
   :00405579 push eax
   :0040557A push ebp
   :0040557B push 0043643C
   :00405580 call mrlocks.004017B0
   :00405585 mov al, byte ptr [0042DCA1]
   :0040558A mov edx, dword ptr [esp+1C]
   :0040558E add esp, 0000000C
   :00405591 cmp al, 04
   :00405593 mov ecx, ebp
   :00405595 mov esi, 0043643C
   :0040559A jnb 004055A5
   :0040559C mov edi, dword ptr [edx+4*ebx+00000138]
   :004055A3 jmp mrlocks.004055AC
   :004055A5 mov edi, dword ptr [edx+4*ebx+000002C8]
   :004055AC mov eax, ecx
   :004055AE add edi, 00000004
   :004055B1 shr ecx, 02
   :004055B4 repz
   :004055B5 movsd
   :004055B6 mov ecx, eax
   :004055B8 and ecx, 00000003
   :004055BB repz
   :004055BC movsb
   :004055BD pop edi
   :004055BE pop esi
   :004055BF pop ebp
   :004055C0 pop ebx
   :004055C1 add esp, 0000001C
   :004055C4 ret 000C
   :004055C7 nop
   :004055C8 nop

错误定位
在对上面这段代码进行分析后,终于能够比较快的定位源码所在了。出错点的代码是 mov dword ptr [ecx], eax,这是个内存操作,与错误的表现是相符的,但程序有那么多内存指针操作,还需要更多信息来判断这是哪个函数里的代码。出错点上面的 call MSVCRT.rand 帮了大忙,这是调用 MSVCRT.DLL 中的 rand 函数,在源码中搜索所有调用 rand 的地方,再对比每个搜索结果的上下文,很快就知道这段代码来自处理加密锁本地连接的函数。因为这个函数在 rand 之前有一个乘 8 的操作,与 shl ebp, 03 恰好对应,在 rand 后面有版本比较的代码,最新驱动版本号就是 4,恰好与 cmp cl, 04 匹配了。如果软件以本地连接方式与加密锁通讯,会先判断本地驱动的版本号是否低于 4,如果不低于 4,则 jnb 0040552D,否则就使用老的通讯协议,往下执行这段导致错误的代码

   :00405518 mov edx, dword ptr [esp+10]
   :0040551C and ebx, 0000FFFF
   :00405522 mov ecx, dword ptr [edx+4*ebx+00000138]
 * :00405529 mov dword ptr [ecx], eax        (出错点,本机使用的是最新驱动,代码不应该走到这里的)
   :0040552B jmp mrlocks.00405540

判断原因
这样我们就比较容易判断问题所在了。错误出在处理本地连接加密锁的代码中,安装在 TEST 上的软件只有 LINKPROJECT 是采用本地连接方式访问加密锁的,其他软件都是通过网络连接访问加密锁,那么应该是 LINKPROJECT 服务被激活时出的错。可是,TEST 那台机器上的 MrDriver.dll 已经是最新的了,所以 cmp cl, 04 这句版本判断的结果肯定不应小于 4 啊。实际情况是,使用最新驱动的本地连接却被服务当成了使用旧版驱动的本地连接来处理,从而导致内存访问错误。那么,肯定是那个保存版本号的变量当时确实是小于 4 了。为什么它会小于 4 了呢?于是检查保存版本号的变量,发现这个变量居然被声明成全局变量了。按理说,应该是每个加密锁连接中保存一个私有的版本变量,这样才能根据各个连接使用的驱动版本决定如何进行通讯。由于这个变量被声明为全局公用变量,当有用户从其他机器使用旧版驱动访问加密锁时,这个变量就被改写为小于 4 的数,之后本机 LINKPROJECT 服务被激活,使用本机新版驱动去与加密锁服务通讯,而 mrlocks.exe 根据这个全局变量判断,还以为它使用的是旧版驱动的,于是采用旧版协议进行通讯,从而导致内存访问错误。

解决问题
找到问题所在后,解决就很简单了,将这个版本号作为私有变量放到到处理加密锁连接的类里去就行了,这样每个连接与加密锁服务通讯时用的使用的都是自己的版本号,不会相互影响,也就不会出错了。




                                                                                                                                 作者:孙宗林 
实战案例:通过minidump定位内存访问违规错误 通过实际案例演示如何使用minidump捕获并分析程序崩溃时的内存状态,精准定位内存访问违规问题,提升调试效率,minidump成为关键诊断工具。 阅读详情

相关推荐

一键修复内存访问错误的解决方案

一键修复工具,如CCleaner、System Mechanic等,通常包含一系列预设的系统优化和故障修复选项。这些工具的工作原理是扫描系统,寻找已知的错误配置、无效的注册表项、临时文件和缓存等,然后执行清理、修复或优化操作。

weixin_35414260的博客 1502

RT-Thread 消息队列(学习笔记)

本文参考自[野火EmbedFire]《RT-Thread内核实现与应用开发实战——基于STM32》,仅作为个人学习笔记。更详细的内容和步骤请查看原文(可到野火资料下载中心下载)

Super辉sir的博客 5282

解决Windows“内存不能为read”错误的全面指南

简介:出现“内存不能为read”的错误提示时,通常涉及软件bug、驱动程序问题、病毒入侵、硬件故障或系统文件损坏等问题。该简介提供了系统的问题识别、原因分析及解决步骤,并给出了预防措施。对于遇到此类问题的用户来说,通过采用上述解决方案,大多数情况下可以成功定位并修复问题。如果问题持续存在,建议寻求专业人士的帮助。

weixin_32661831的博客 8449

[读书笔记]进程描述和控制

进程描述和控制进程的概念进程是一个具有独立功能的程序,是关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体,是正在运行的程序的实例,是基本的分配单元和执行单员。每一个进程都有它自己的地址空间,包括文本区域,数据区域和堆栈。文本区域存储处理器执行的代码,数据区域存储变量和进程执行期间使用的动态分配的内存,堆栈区域存储着活动过程调用的指令和本地变量。进程具有如下

sugaryaruan的博客 947

内存错误修复工具完整解决方案

内存错误是程序运行过程中最常见且影响严重的故障类型之一,通常表现为程序崩溃、系统卡顿、数据异常甚至系统蓝屏。这类错误主要源于内存访问不当或资源管理不善。常见的内存错误类型包括内存访问违规(如访问非法地址)、内存泄漏(未正确释放内存)和缓冲区溢出(写入超出分配空间)等。其根本原因多与程序设计缺陷(如指针使用不当)、驱动程序兼容性问题系统文件损坏或硬件异常有关。理解这些基本概念和成因,是后续深入分析、检测和优化内存问题的基础。

weixin_35982453的博客 675

realsense D455深度相机+YOLO V5结合实现目标检测(一)

realsense D455深度相机+YOLO V5结合实现目标检测代码来源环境配置代码分析:1.如何用realsense在python下面调用的问题:2.对main_debug.py文件的分析:结束语 可以实现将D435,D455深度相机和yolo v5结合到一起,在识别物体的同时,还能测到物体相对与相机的距离。 说明一下为什么需要做这个事情?1.首先为什么需要用到realsense D455深度相机? 因为他是普通的相机还加了一个红外测距的东西,所以其他二维图像一样,能够得到三维世界在二维像素平面的投影

文一生 3万+

进程管理&&内存管理

进程管理&&内存管理

weixin_49301912的博客 1269

告别手动标注!PDMS NakiToolkit插件安装与初体验:以Pipeline工具为例

本文详细介绍了PDMS NakiToolkit插件的安装与使用,特别是其Pipeline工具如何通过自动化标注和材料统计功能大幅提升三维工厂设计效率。从环境准备到实战演示,帮助工程师告别繁琐的手动标注工作,实现项目交付周期的大幅缩短。

weixin_30047059的博客 349

关于star ccm 错误代码8的解决方案

第二步:打开该文件,复制CDLMD_LICENSE_FILE,到环境变量里面 创建新的用户变量 :变量名使用CDLMD_LICENSE_FILE 变量值选择许可证文件。我尝试了百度上的一些解决办法,都没有解决我的问题,后来重金请淘宝师傅远程安装。下面说一下淘宝的解决方案,要是能让大家少花钱就太好了。第一步:找到安装目录下的readme_windows文件。

weixin_64895141的博客 7499

DIY天文摄影:如何用NMP溶剂安全去除佳能CMOS传感器的拜耳滤镜(附详细步骤)

本文为天文摄影爱好者提供了一份详尽的DIY指南,介绍如何使用NMP溶剂安全去除佳能CMOS传感器的拜耳滤镜,将其改造为高灵敏度单色相机。文章深入剖析了NMP溶剂的作用原理与关键风险,并系统性地拆解了从材料准备、分步操作到后期验证的完整实践流程,旨在帮助具备动手能力的爱好者实现深空天体摄影的进阶目标。

w3x4y的博客 306

Zynq裸机调试RTL8211FS网卡踩坑记:从ping不通到完美兼容的完整代码修改

本文详细记录了在Zynq平台上使用Xilinx SDK(XSDK)调试RTL8211FS网卡的完整过程,从最初的ping不通问题到最终实现完美兼容的解决方案。通过分析PHY芯片的寄存器配置差异,提供了关键代码修改和调试技巧,帮助开发者快速解决类似问题。

weixin_42550597的博客 419

Java运行StarCCM+脚本方法时的异常

1.使用host,port创建Simulation对象时报NullPointerException 通过debug找到错误位置,RELEASE_NOTES文件不存在。 这个跟之前的设置有关。 程序运行时会找RELEASE_NOTES文件,从源码中能看到,这个文件应该处于第三个父路径下。 以上面的路径为例,这个文件应该存在于D:/starccm+目录下。 所以我能只要找到RELEASE_NOTES文件,复制到D:/starccm+目录就可以了。 复制D:\starccm+\15.02.007-R8\STA

qq_41328632的博客 6757

基于Coze平台从零构建AI智能体:以测试用例生成为例的实战指南

在人工智能技术快速发展的今天,大语言模型(LLM)和提示词工程(Prompt Engineering)已成为构建智能应用的核心技术。其原理在于通过自然语言指令引导模型完成特定任务,其技术价值在于极大地降低了AI应用开发的门槛,使非专业开发者也能快速实现想法。这一技术广泛应用于自动化办公、智能客服、内容生成等场景。本文聚焦于字节跳动旗下的Coze平台,该平台通过可视化工作流编排和预置技能,将上述技术封装为易用的工具。文章以“根据产品需求文档(PRD)自动生成测试用例”这一具体场景为例,详细拆解了从需求分析、工

weixin_30617695的博客 337

结构体指针为分配内存访问结构体成员错误

原帖地址:http://topic.csdn.net/u/20091205/20/6af2931e-ce9a-4ccb-bf2f-13a49f39963f.html?seed=592508926&r=61679380#r_61679380 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #include #inclu

小鸟学习的专栏 2282

AMD Ryzen AI Max+ 395四机集群实战:开源工具链与大模型推理优化全解析

本文详细解析了基于AMD Ryzen AI Max+ 395处理器的四机集群搭建与优化实践,涵盖硬件配置、开源工具链评测及大模型推理优化技巧。通过深度测试,揭示了集群在AI推理中的性能瓶颈与解决方案,特别适合需要扩展显存的大模型实验场景。文章还提供了成本效益分析,帮助开发者做出更明智的选型决策。

weixin_29041767的博客 1516

VT-Refine:基于仿真微调的视觉-触觉反馈双臂装配强化学习

本研究提出VT-Refine框架,通过融合真实世界示范、高保真触觉仿真与强化学习,解决高精度双臂装配任务。方法分为两阶段:首先利用少量人类示范数据预训练视觉-触觉扩散策略;随后在数字孪生仿真环境中进行强化学习微调。关键创新包括:开发GPU加速的触觉仿真模块精确模拟压阻式传感器;采用基于点云的多模态表征实现无缝的跨领域迁移。实验表明,该方法在五个双臂装配任务中显著提升性能,触觉反馈使成功率提高40%。研究首次实现仿真环境中的大规模双臂视觉-触觉强化学习及sim-to-real迁移,为接触密集型任务提供了新解决

2506_90492529的博客 1795

内存访问地址段错误

段错误 :        1.段错误定义:       段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。        2. 段错误产生的原因 :        2.1 访问不存在的内存地址         #include #include void ma

jiangcheng99的博客 2697

2025年下半年网络规划设计师综合知识真题及答案解析

1983年,ARPANet完成技术转型,对此后的 Internet发展全关重要,这一转型是指( ) A.电路交换转向分组交换 B.商业化转型 C.民用化转型 D.从 NCP 协议转向 TCP/IP 答案:D 解析:ARPANet 最初使用 NCP (Network Control Protocol)协议进行主机问通信。1983年1月1日,ARPANet 正式切换到TCP/IP 协议族,为后续Internet的发展奠定了统一协议基础。

鹿鸣天涯 923

C++常见的内存错误和解决策略

未初始化指针 (Uninitialized Pointer);内存分配未成功却使用了它;野指针 (Dangling Pointer);内存泄漏 (Memory Leak);重复释放内存 (Double Free);内存越界访问 (Buffer Overflow);错误的数组删除方式 (Mismatched Delete);栈内存溢出 (Stack Overflow);

红军不怕远征难,万水千山只等闲 2077

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

深度学习工具包 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")

DCNv4项目中CUDA内存访问错误的深度分析与解决方案

在使用DCNv4构建神经网络backbone时,开发者遇到了一个令人困惑的CUDA内存访问错误。具体表现为:当循环执行DCNv4层前向传播256次时,系统会抛出"illegal memory access"错误,并显示相关的CUDA内核启动参数。 错误信息明确指出问题发生在dcnv4_im2col_cuda操作中,内核的grid维度为(1600,1,1),block维度为(16,4,8),共享内...

gitblog_07501的博客 605

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

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

AIX内存访问错误

    今天在测试公司的一组API时发生了内存访问错误(AIX5.1 64位机器,32位系统)。这组API在编译成32位的程序时测试是正确的,可是编译成64位程序时问题就出现了:用malloc分配内存成功,但当用memset访问这片内存时程序core了。我猜想是API某个地方的bug导致了内存泄漏,于是一行一行源码地翻查(上万行代码,我的神啊),始终没查出个所以然来。这个时候,除了google,我还能干什么呢?    google...google...google...    然后,答案出现了,加上头文件

in2000的专栏 757

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【转】内存访问过界

原文地址:[url]http://hi.baidu.com/liheng_2009/blog/item/c065e880cc09129ef603a6e8.html[/url] 最近公司一台服务器的某个服务无故死掉,查看系统日志/var/log/messages ,发现有如下报错: segfault at 0000000000000000 rip 0000000000878bd1 rsp...

dazhilao 471

BilibiliDown项目SIGBUS内存访问错误分析与解决方案

你是否在使用BilibiliDown下载视频时遇到过程序突然崩溃,控制台输出"SIGBUS"错误?这种看似神秘的错误实际上源于内存访问对齐问题,特别是在涉及本地代码调用和内存映射操作时。本文将深入分析BilibiliDown项目中可能导致SIGBUS错误的原因,并提供系统性的解决方案。 ## 什么是SIGBUS错误? SIGBUS(Signal Bus Error)是Unix/Linux系统中...

gitblog_07819的博客 375

C++常见的内存错误及解决方法

C++常见的内存错误及解决方法 (1)内存分配未成功,却使用了它。 解决方法:在使用内存之前先检查指针是否是NULL。如果是用malloc来申请内存,应该用if(p == NULL)或if(p != NULL)进行防错处理。如果是new来申请内存,申请失败会抛出异常,所以应该捕捉异常来进行防错处理。 (2)内存虽然分配成功,但尚未初始化就引用它。 解决办法: 尽管有时候缺省时会自动初始化,但无论什...

c+c++的博客 1839

C语言内存访问错误,c语言中出现内存错误的常见案例.pdf

c语言中出现内存错误的常见案例,c语言项目案例分析,c语言内存分配,c语言课程设计案例,c语言内存管理,c语言动态内存分配,c语言申请内存,c语言内存模型,c语言案例,c语言释放内存cccc 语言中出现内存错误的常见案例:大家好,最近一直在学习c/c++,发现进行定期的总结很有必要,故发帖希望能够征集c/c++中常见的错误分析及解决方案,希望与一些志同道合的朋友共同学习,在此,我先抛砖引玉,分析一...

weixin_28788983的博客 436

常见的动态内存错误

关于动态内存的一些常见错误

JonlyMay的博客 1116
上一篇: Win32程序函数调用时堆栈变化情况分析(zt)
下一篇: Windows自带的小巧的调试利器(转)
evers
博客等级 码龄24年 7粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值