热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

低级失误害死人

写了一个月的代码,前几天总算基本完工了,结果交给别人一用,处理稍大一点的文件竟然100%会crash。因为毕竟现在写代码手生的厉害

     写了一个月的代码,前几天总算基本完工了,结果交给别人一用,处理稍大一点的文件竟然100%会crash。因为毕竟现在写代码手生的厉害,再加上时间太紧也没有对自己的程序进行过很充分的自测,心虚的很,所以只好发狠连续加班熬夜找自己的bug。

      从现象看,每次crash都是new, delete 或者malloc出的错,或者有时一个HANDLE莫名其妙地变成了一个非法值,应该是由于内存越界引起的。但是内存越界实在太难找了,心想该不会要动用Bounds Check之类的东东吧,那个家伙我不熟,这么短短的几天恐怕是学都学不会,可那边是火烧眉毛着急催着呢。最终横下一条心,还是用笨办法,回头一行一行啃自己的代码吧。

      首先第一步,怀疑是线程之间同步做得不好,于是小心翼翼地把几个线程的代码完全重新写了一遍(幸亏主要的功能都封装在类里了,所以线程的主体代码不是很多),Crash。
      第二步,把所有对数据的处理都注释掉,保留的代码只是读数据、放入buffer,取数据,释放...之类的简单操作,还是Crash...(不过这样也好,如果问题只是出在这些地方,那倒好找了,心中稍稍放松了些)
      第三步,轻松之际,仔细看了一下自己对buffer操作的函数,可是却死活没发现有什么问题,互斥和同步都做得很好,分配和释放内存也都很小心,于是怀疑是不是自己写的Queue模板有问题。
      第四步,检查自己的Queue类,总共不到300行程序,却楞是看不到内存越界的迹象。如果对这些代码反复琢磨和运行10遍以上还没看出哪里有内存越界,我想我就可以改行,或者回到大二重学一遍数据结构了(当时只考了61分,好悬 emembarrassed.gif)...线索到此中断...心中又是一紧

      悲痛难过中......

      正在不知所措的时候,偶尔打开Visual Studio的Project Properties,发现有一个编译参数,Runtime Library,其中有这么两个让我印象深刻的选项:Multi-threaded Debug (/MTd) 和Single-threaded Debug (/MLd),我写的是Multi-thread,但这里我用的是缺省参数:Single-threaded Debug (/MLd)。隐隐约约我记得第一次用VC写多线程的时候就犯过这样的错误,但毕竟当时是可以容忍的,而现在...没什么好说的,结果就是加班加班再加班......老大说得对,做事情是需要素材的,我觉得我就一直是个没有素材的人。我最缺乏的也是稳重和积累...

      第一个项目感觉做地磕磕绊绊的,希望到时候能顺利交差就好了。昨天同学聚会,只喝了一点点酒,虽然酒量一向不济,但也不至于如此萎靡,眼看自己都要快Crash了,最后靠打盹喝疙瘩汤出了点汗才好起来,郁闷!

转:https://www.cnblogs.com/xgchang/archive/2004/12/18/78901.html



推荐阅读
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
author-avatar
caiyingsheng852
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有