周末被一个BUG折腾的欲仙欲死
有一个应用场景:从网上得到大量的文字信息,保存到本地。
因为不停地获取文章,导致本地存储很快就变大。所以想到了简单地压缩。
网上找了一段压缩的代码:
+(NSData*)zipContent:(NSString*)strContent
{
NSData* zippedData = nil;
NSData* unzipData =[strContent dataUsingEncoding:NSUTF8StringEncoding];
int nSize =[unzipData length];
Bytef buffer[nSize];
Bytef zipbuffer[nSize];
[unzipData getBytes:buffer]; uLongf zippedLength; int zRet =compress(zipbuffer, &zippedLength, buffer, nSize);
if(Z_OK == zRet)
{
zippedData = [NSData dataWithBytes:zipbuffer length:zippedLength];
} return zippedData;
}
能正常工作,并且很有效地减少了存储空间的使用。
对应地,写了解压的过程:
+(NSString*)unzipContent:(NSData*)zippedData
{
NSString* strContent = nil; int nSize =[zippedData length];
Bytef buffer[1024*1024];
Bytef zipbuffer[nSize];
[zippedData getBytes:zipbuffer]; uLongf unZippedLength=1024*1024;
int zRet =uncompress(buffer, &unZippedLength, zipbuffer, nSize);
if(Z_OK == zRet)
{
strContent = [[NSString alloc] initWithBytes:buffer length:unZippedLength encoding:NSUTF8StringEncoding];
} return strContent;
}
正是上面这两个方法,让我的周末陷入到了欲仙欲死的解BUG过程中。
应用在跑到unzipContent这个方法时,挂了。
堆栈信息显示挂在
watch显示zippedData为nil.
因为从网上拿数据,压缩,解压,显示等过程是处于不同的线程,所以第一时间怀疑是数据在跨线程的使用上出了问题。
一步步分解原因,尝试了很多种解决方法,都无果。每次运行都在断在了上图的位置。方法都没进去,调试信息少的可怜。
最后,灵光一闪,会不会是堆栈信息被破坏掉了?仔细看一下代码,果然,在方法里面申请了大量的栈信息,导致栈溢出了。
修改buffer的空间到堆上。问题果然解决。
周末被一个BUG折腾的欲仙欲死的更多相关文章
- 周末发现一个BUG,时有时无,一出程序就崩溃,郁闷了好久,终于跟出来来了,记之,提醒自己今后一定规范编写,只要规范,绝对不会出问题
-- :::] cell0 create -- :::] *** Assertion failure /UITableView.m: -- :::] [ Uncaught Exception ] Na ...
- qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新
qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新 Widget wit ...
- 从修复 testerhome(rubychina)网站的一个 bug 学习 ruby&rails on ruby
前言 testerhome: http://testerhome.com/topics/1480 对于一个差点脱离前沿技术人,想要学习ruby,就意味着要放弃熟悉的操作系统windows,熟悉的ide ...
- z-index失效原因分析——由一个bug引发的对层叠上下文和z-index属性的深度思考
新年刚开工就被一个bug虐得整个人都不好了,特地记录下. (一)bug描述 在一个fixed-data-table(一个React组件)制作的表格中,需要给表头的字段提示的特效,所以做了一个提示层,但 ...
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- MySQL关于exists的一个bug
今天碰到一个很奇怪的问题,关于exists的, 第一个语句如下: SELECT ) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD ...
- 由一个bug引发的SQLite缓存一致性探索
问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...
- Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
Win10左下角菜单打不开,好痛苦,点击右下角的时间也没反应,各种不爽,折磨了我好几天,重装又不忍心,实在费劲,一堆开发环境要安装,上网找了很多方法都不适用.今天偶然解决了,仔细想了下,难道是Win1 ...
- 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG
这篇文章并不在我的 underscore 源码解读计划中,直到 @pod4g 同学回复了我的 issue(详见 https://github.com/hanzichi/underscore-analy ...
随机推荐
- 学习中的错误——ubuntu 14.04 LTS 启动eclipse报错
在ubuntu中启动eclipse报错:(Eclipse:15978): GLib-GIO-CRITICAL **: g_dbus_connection_get_unique_name: assert ...
- 存到cookie里能提高性能吗?
今天刚刚看了篇微信,大体意思是说g哥之类的网站把很多存session的东西都放cookie里了,可减少服务器的负担种种.然后我就发现我对request到application的记忆有些模糊了,哪些是在 ...
- Action的搜索顺序(Struts2搜索Action的机制)
当访问如下链接时, http://localhost:8080/struts2Demo/path1/path2/path3/LoginAction.action 第一步:判断当前路径下action是否 ...
- Java 单列模式(Singleton)
单例模式(Singleton) 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 目的:使得类的一个对象成为系统中的唯一实例. 如何保证一个类只有一个实例并且这个实例易于被访问呢? 我们都 ...
- iOS $299申请时碰到的狗血问题
最近项目需要申请in-house证书,结果在提交审核前一步,遇到问题:Enter your organization information.please enter the Romanized ve ...
- C语言程序设计第4堂作业
大家注意:本次作业稍有增加,由于放假期间大家空闲时间比较充足,将之前学习过程中遗留的问题必须在假期解决. 本次课学习主要内容: 分支结构中的二分支结构.多分支结构和else-if语句 掌握字符型数 ...
- Hadoop原理介绍
Hadoop核心之HDFS 架构设计 老嗨 2015-09-18 16:55:00 浏览225 评论0 摘要: 概述:HDFS即Hadoop Distributed File System分布式文 ...
- PYTHON 链接 Oracle
一. cx_Oracle Python 连接Oracle 数据库,需要使用cx_Oracle 包. 该包的下载地址:http://cx-Oracle.sourceforge.net/ 下载的时候,注 ...
- 【笔记】Fragment使用
1.静态加载 1.1 首先定义每一个Fragment的布局文件. 1.2 创建每个fragment类,需要继承Fragment.并使用onCreateView()的inflater.inflate() ...
- VS2012新建项目出错:未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService
刚刚重新做的系统,第一次打开vs2012新建项目时出现错误提示 通过查找解决办法发现方法有两种: 1:卸载两个windows更新补丁(KB2833957和KB2840642) 2:安装一个window ...