发电机电磁计算_第1页
发电机电磁计算_第2页
发电机电磁计算_第3页
发电机电磁计算_第4页
发电机电磁计算_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I题目:660MW半速核发电机电磁计算及优化研究方向:指导教师:二0一七年七月自己的代码。实现了一个iOS平台的SDK,开发者通过嵌入该SDK,并且在应用程序代码中添加TheprosperityofMobileInternetimpulsesthepopularityofmobileapplicationdevelopment.Asoneofthemostimportantplatform,iOShasthousandstohelpusdeveloperstrackcodingis第1章绪论 11.1研究背景 错误!未定义书签。1.2发展现状 错误!未定义书签。1.3研究意义 错误!未定义书签。 3 42.1需求分析 42.1.1功能需求 42.1.2非功能性需求 62.2同类产品调研 6 6 7 8 错误!未定义书签。3.1系统总体结构 3.2系统技术方案 3.2.1系统开发语言与环境 3.2.2开发环境隔离 3.2.3自动化代码部署 3.3.1Conch子系统 3.3.2Hairtail子系统 3.3.3Crab子系统 3.4系统业务流程 263.5项目预期成果 3.6本章小结 错误!未定义书签。4.1关键技术 4.1.1崩溃收集与传回 4.1.2实时堆栈符号化 4.1.3符号化工具实现 4.2Mach-O格式 4.2.1Mach-O简介 4.2.2Mach-0文件结构 V 4 错误!未定义书签。5.1Conch子系统 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 5.2.1文件获取 5.2.3文件及额外信息的传回 5.3Crab子系统 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。5.4Pier子系统 错误!未定义书签。5.5Mussel子系统 错误!未定义书签。 错误!未定义书签。5.6子系统整合 错误!未定义书签。 错误!未定义书签。5.6.2使用Nginx服务器…………错误!未定义书签。6.2.1SDK的嵌入………………错误!未定义书签。6.2.2安装Hairtail应用程序……错误!未定义书签。错误!未定义书签。6.4预期结果…………错误!未定义书签。6.5测试结果……………错误!未定义书签。6.5.1功能测试结果………………错误!未定义书签。6.6本章小结……………错误!未定义书签。 错误!未定义书签。7.1总结 错误!未定义书签。7.2展望 错误!未定义书签。 1.1附录1 致谢 6图表目录 9 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。图5.7崩溃概览图 错误!未定义书签。图5.8崩溃统计分析图 错误!未定义书签。图5.9崩溃堆栈图 错误!未定义书签。图5.10应用程序设置图 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。图6.6崩溃描述信息图………错误!未定义书签。图6.7崩溃详细堆栈信息图…………………错误!未定义书签。 错误!未定义书签。 错误!未定义书签。图6.11崩溃报告处理(开始)图 错误!未定义书签。图6.12崩溃报告处理(结束)图 错误!未定义书签。 表4-3模块DIE常见属性 表4-4子程序DIE常见属性 1第1章绪论天都有成千上万个移动端应用程序上架。并且随着人们对于应用程序付费意识的增可能多达几亿用户。然而,有程序开发就意味着会有存在潜在Bug的可能,并且由于最终用户众多,程序中一个小小的Bug都可能会导致其在成千上万台移动设备上国内过去设计制造的汽轮发电机大都是全速的,半速与全速汽轮发电机的设计原汽轮发电机的设计研究起到了引导作用,有一定的参考价值。2例如法国为76.2%、斯洛伐克56.4%、比利时为53.8%、瑞典为42%、瑞士为39.2%、匈计制造能力,在核电汽轮发电机设计制造方面技术领先的公司有美国GE公司、瑞士在核电半速汽轮机的设计、制造方面有着大量成熟的经验和运行业绩,国内大公司都1.2.2国内发展现状一轮核电发展的“核”心动力。我国在上个世纪90年代建设了秦山第二核电厂、秦的电力事业做出贡献。所以国家发展与改革核电“远景规划”,远景目标是到本世纪20年代末,我国核能发电装机容量将达到3600万kW。这个规划实际上意味着,我国每年将至少批准建设2个1000MW级核电机组。目前正在进行前期工作的核电项目有:广东的岭澳二期(岭东)、阳江核电项目;三门这两个核电项目已经批准立项。除此以外还有其他几个省份也在筹划核电项目。核能是21世纪能源的主要支柱之一,作为国家重点发展的高新技术和能源领域,具有广阔的发展前景。根据有关报道我国计划在未来15年内建设30座1000MW级核电机组,使核能在我国得以更广泛深入的利用,从而调整能源结构。级大型汽轮发电机开发设计研究”,项目负责人为丁舜年院士、汪耕院士,负责单位3这次对1000MW级汽轮发电机的电磁方案计算、机械强度应力分析和各专题研究员,能对联合设计起很好的作用,为自主研制奠定基础。目前我国已经具备开发、设计和建设30万kW级和60万kW级核电站的能力,但在1000MW级核电机组的技术、设计与制造等方面尚处于开发研究阶段[12]。由于2020年前我国要投资兴建核电汽轮发电机技术及其成熟的运行经验。根据核电市场新的需求,该公司于2004年派出人员与SWPC联合优化设计1300MW核电用汽轮发电机[13],并已完成方案设计。预计2010年前,1000MW核电机组投运并国产化,2010年后发展机组,2030年发展20001.提出了模拟汽轮发电机稳态运行的新方法。本文提出了一种基于Ansoft/Maxwell外电路每相绕组中施加等效负载阻抗模拟2.转子磁路结构对半速汽轮发电机参数的影响。转子磁路结构的变化包括转子槽分度数的变化;转子采用小槽结构;转子采用偏槽结构。本文工作内容之一就是对1000MW级半速汽轮发电机在不同转子磁路结构情况下应用Ansoft/Maxwell对电机进行磁场分析[14],得到发电机的磁场分布、电抗的原因。3.对汽轮发电机电指计算程序进行修正。我国普遍使用的汽轮发电机电磁方案设计计算公式—机械工业部电工专业指导4机的设计经验,通过在计算公式中加入转子偏在对(DZ)28-63修正的基础上,应用VB与Matlab混合编程把修正后的“DZ”编第2章提出模拟汽轮发电机稳态运行新方法本系统需要支持崩溃报告的收集、崩溃统计信息的收集、崩溃处理额外信息(dSYM文件以及dSYM文件类型等)的上传,崩溃堆栈服务端符号化、崩溃的聚类2.1需求分析崩溃信息收集1)设备状态信息●操作系统语言5●设备类型●当前网络类型●是否在充电●是否内存低2)应用程序相关信息●应用程序唯一标识符●设备唯一标志符●应用标识符●应用版本●应用启动时间●应用是否破解3)崩溃相关信息●崩溃次数●异常类型崩溃报告的解析与展示4.以饼状图、直方图等可视化方式显示崩溃相关的统计数据。5.对崩溃进行分组聚类,为崩溃分组提供崩溃额外调试信息,从而让开发者了6.做到各种统计报表的自动生成。7.发送崩溃邮件报告:6a)实时崩溃报告除了系统的功能性需求,本系统还需满足系统的非功能性需求,从而使得系统具有易用性、安全性、高可用性等特性,包括以下几点:●服务端稳定可达。本系统的设计实现过程中参考了一些开源社区项目及商业项目。通过对这些项目的分析研究,确定了本系统的结构以及发展方向,其对本系统的设计与实现提供了重●QuincyKit⁵](Hockeyapp的开源实现)QuincyKit是一个开源的iOS及Mac平台下的崩溃收集系统,整个系统的结构与本系统的最终结构类似,对该系统代码及结构的分析对本系统的设计与实现有重大的经过调研分析,发现QuincKit可以分为以下几个部分:3.PHP客户端:用于从服务端抓取最新的崩溃并进行本地符号化。71.新建一个iOS项目,把QuincyKit的Framework嵌入到项目中,指定服务器端HTTP地址。应用程崩溃后,该Framework会通过HTTP请求把崩溃信息2.开发者在本地Mac开发机运行QuincyKit的Client端代码去服务端获取所有未处理崩溃,并且调用Mac本地的atos工具进行堆栈二进制地址符号化,用生成的符号去替换原崩溃报告中的二进制地址,得到最终的结果崩溃报告供开发者进行分析,原始崩溃报告和目标崩溃报告如附录1、附录2所示。经过调研发现发现其原理为:开发者在iOS应用程序中设置发生崩溃时,崩溃信调用HTTP请求把产生的崩溃发送给目标QuincyKit服务端。服务端做最简单的聚类分析之后把崩溃存储在MySQL数据库中。PHPServer端抓取所有未处理崩溃并调用Xcode中自带的symbolicatecrash.pl脚本来解析该崩溃报告。该Perl脚本如果找到合适的符号表文件就会调用Mac下的atos命Crashlytics的用户体验做得很好,一切以方便开发者使用为目的,让开发者可以的指引者。调研过程中发现的如下几点使得本系统的设计过程提前考虑了很多因素:●Crashlytics包括崩溃收集的URL在内的多项配置都是在启动SDK时候的从服务器上请求得到的,这样可以实现动态配置功能。●Crashlytics的多个崩溃是单个发送的。(本系统的最初的设计是当有多个崩溃时,把所有崩溃报告写入同一个文件,并且下一次运行时,把所有的崩溃报告通过一次HTTP请求全部发送给服务器,从而节省发送时间。但是由于多个崩溃导致需要与服务器进行长时间的通信,导致崩溃数量越多,越难成功发送,影响开发者应用程序的性能。8●Crashlytics除了在URL和崩溃报告中包含了APPToken,在请求里还包含●同一个崩溃文件中包含大量<redacted>符号。经过调研发现,从iOS6开始,进行客户端本地符号化时,并不能得到某些系统级Framework的符号信息,会统一返回<redacted>符号,导致客户端无法做到完全符号化系统库。因此系统需要在服务端对<redacted>符号进行处理。QuincyKit系统中底层的崩溃收集使用了开源框架PLCrashReporter。该开源框架●仅使用公开的APIs、ABIs收集崩溃,避免了因为使用非公开APIs,导致应用程序不能在AppStore上架。●可以收集所有运行线程的崩溃信息。●可以处理未捕获的Objective-C异常及其他FatalSignals(SIGSEGV,SIGBUS等)。●作为一个最底层的服务,可以方便容易的嵌入已有的崩溃报告服务中。●可以记录崩溃时完整的寄存器的状态。PLCrashReporter开源框架基本满足本系统对SDK功能方面的需求,并且由于开放源代码,因此容易进行定制。结合本系统的需求分析以及对同类产生的调研,本文对系统做了如下设计:本系统命名为EGG系统,含义为对开发者的应用程序进行照料、孵化。整个系和Mussel子系统。如图2.1所示:9其中Hairtail从开发者开发机收集应用程序编译产生的文件发送给Crab,Conch从最终用户iOS设备收集崩溃信息发送给Crab。Crab接收到二者发送的数据并进行分析处理,其中涉及到的业务数据存储在MySQL中,需要缓存的数据存储在Redis中,需要进行统计分析的数据存入Mussel中,并且使用RabbitMQ作为系统消息队列。开发者通过PierWeb界面登录本系统查看应用程序的崩溃数据和统计信息。本系统网络结构图如下:0S设备iOS设备10S设备其中,HairtailMac应用程序安装在开发者Mac开发机上,在开发者编译应用程序的时候把本次编译产生的文件发送给服务端。最终用户在iOS设备上安装开发者已经嵌入Conch的应用程序,如果程序运行崩溃,那么在应用程序下次启动时,SDK会把上次运行产生的崩溃报告发送给服务端。Nginx服务器作为系统的外部接口转发所有请求。如果请求来自Hairtail或者Conch,那么转发给Crab服务器,否则转发给Pier服务器。Crab服务器响应请求时会把崩溃有关数据写入MySQL数据库服务器,把统计数据写入Mussel服务器,处理过程中产生的需要缓存的信息写入缓存服务器,所有和异步任务有关的任务都会写入消息存储服务器,由后端Worker进行处理。开发者查看崩溃信息的请求经过Nginx服务器转发给Pier服务器,Pier子系统从MySQL服务器和Mussel服务器获取有关信息后通过Web页面展示给开发者。Conch是一个iOS平台的SDK,用于崩溃报告的收集。Hairtail是一个Mac平台的应用程序,用于从开发者本地开发机收集应用程序编译时产生的dSYM文件、应用程序图标、编译额外信息等。Crab是崩溃处理的服务端,用于对崩溃报告进行解析、符号化、聚类分析等功Pier用于其他业务逻辑,例如:用户邀请、用户注册、崩溃信息展示等。Mussel类似一个数据仓库,存储所有需要用于统计分析的崩溃信息。系统中各个子系统通过Internet进行交互,降低了各子系统之间的耦合度,其交互流程图如图2.2所示:求第3章转子磁路结构对半速汽轮发电机参数上文把本系统分为了五个子系统:Conch子系统、Hairtail子系统、Crab子系统、Pier子系统和Mussel子系统。本章将介绍系统的总体结构、系统使用的技术方案、各子系统的详细设计、系统业务流程及项目预期成果。本系统的总体结构如图3.1所示,整个系统分为客户端和服务端两个部分:子系统统系统统数据库据库Hairtail子系统从开发者开发机上收集信息,Conch子系统从iOS设备上收集信息。然后通过Nginx网络入口发送给服务端。Nginx根据请求类型转发给Crab子系统或者Pier子系统。Crab子系统和Pier子系统与Mussel子系统和系统其他存储部分3.2.1系统开发语言与环境1.Conch子系统和Hairtail子系统使用Objective-C进行开发。2.Crab子系统和Pier子系统使用Python进行开发,并使用MySQL存储业务数据。6.所有子系统都运行在AmazonEC2虚拟服务器上。3.2.2开发环境隔离Python的pip工具安装virtualenv,通过命令行调用virtualenv--no-site-packages环境中的Python,之后通过envbin/pip安装软件包就会把所安装的软件包都安装在该虚拟环境中。3.2.3自动化代码部署为了方便代码的部署,系统使用了Python社区中比较流行的代码部署工具库和命令行工具,用于加快代码部署和系统管理。它3.3各子系统详细设计3.3.1Conch子系统Conch以iOSSDK的形式嵌入到应用程序中,开发者仅仅需要在应用程序中添加一小段代码以及简单的配置就可以实现崩溃信息的自动化收集与处理。功能设计说明小段代码以及少量的配置,就可以实现崩溃信息的自动收集与发送。每当于Bug闪退之后,用户下一次运行该应用程序并且网络可用时就会自动把该崩溃发经过调研,友盟、百度移动统计的SDK使用的都是静态库文件,而Xcode项目开中常用的是Framework形式的库。因此系统有必要给出一个Framework格式的SDK方便用户使用。但是目前Apple还不支持创建iOS平台上的Framework,为了使得开发者开发过程更加方便,本系统使用一个折中的方法(创建FrameworkforioS⁹])把iOS上的静态库和头文件完美打包成一个Framework,通过这个方法,把SDK导出为一个Framework给开发者拖拽使用。业务算法逻辑●崩溃信息的收集:从头编写或者使用开源的崩溃信息收集底层框架,实现崩●统计信息的收集:在崩溃之前以监听设备状态的形式记录各类统计信息并写入某文件,如果程序崩溃,那么下次启动时读取该统计信息文件。1)文件名前缀2)编程接口3)版权信息4)命名冲突由于Conch子系统是一个SDK,很容易与开发者应用程序中的代码产生命名冲每次开发者使用Xcode进行编译时都会产生相应版本的IPA文件和dSYM文本的dSYM文件,因此本系统需要收集编译过程中产生的所有dSYM文件及dSYM●文件的获取:每次开发者使用Xcode进行编译时都去获取本次编译产生的代码特性Hairtail代码风格需要遵守AppleMac应用程序官方的开发规范,并且确保不会Crab是本系统的核心服务,接收Conch和Hairtail发送的崩溃报告、dSYM文以收到dSYM文件后对dSYM文件进行统计解压缩、目录分析等操作,并把分析结果存入MySQL中,留待崩溃报告符号化时使用。收到崩溃报告之后对崩溃报告做一定的处理与分析,处理的具进行堆栈二进制地址符号化,把分析的结果存储在MySQL,把需要统计的信息发送给Mussel子系统。由于MacOSX下符号化过程所需的atos工具并不是开源的,而Linux下的符号具用于符号化过程,该程序要能部署到Linux系统上。Crab分为Dispatcher和Worker两个部分。每当Dispatcher接收到一个崩溃报告或者dSYM文件之后把该处理任务放入系统的任务池。系统中空闲的Worker不断地从任务池中取任务进行处理。如图3.2所示崩溃报告、用图标等溃提醒解析Workerworker解析前溃日报WorkerWorkerWorker图3.2Crab子系统结构图每当Dispatcher接收到一个来自iOS客户端的请求,一旦崩溃Dispatcher会给SDK返回正确处理标志,这样客户端就会删除存储在iOS设备本地每当Dispatcher接收到一个来自Hairtail发送的dSYM文件以及对应的AppToken(用于区分不同的应用程序),Dispatcher会把该dSYM文件临时存起来,并在任务池中添加一个dSYM文件处理任务由Worker进行处理。本系统使用Celery[10的异步任务调用功能,在Dispatcher模块以异步调用的方式统首先使用Python的XML解析库从XML中抽取崩溃统计信息以及崩溃日志。的应用程序,进而判断应用程序的状态以及付费情况(未实现)等。在对该崩溃报告1.0(alpha),BuildVersion是应用程序的编译版本号。因为Xcode每次编译产生的应用程序都会具有不同的UUID,系统根据该UUID来匹配崩溃报告与dSYM版本。2)dSYM解析任务每当Hairtail发送一个dSYM文件到Crab,Crab都会在系统任务池添加一个dSYM文件处理任务用于解析该文件。由于Hairtail端对dSYM文件进行了压缩,因此Worker的第一步就是判断上传的文件是否为Zip文件,如果不是的话那么丢弃,是的话就继续处理。每个dSYM文件夹中都有一个info.dSYM文件对应的应用程序的版本,应用标识符等信息,因此通过这些信dSYM中的Mach-O文件中的UUID信息,就能确定该dSYM对应的BuildVersion,其中包含了Framework的额外信息,例如版本号,标识符等5)数据定时清理任务1百万台iOS设备上发生,那么将会占用大约100G的硬盘空间,这无疑是对系统存制工具进行代码提交,代码Merge等操作。随着一个iOS开应用的dSYM文件会有5M左右,假设每天有1千次编译就会导致1千个dSYM文件的上传,所以一个典型的iOS项目每天可能会产生5G以上的dSYM文件。随着EGG崩溃收集与处理系统用户量的逐渐增多,1000个应用程序,每天就会产生5T为了解决这个问题,系统起初的策略是,只保留最新的100个dSYM文件,每应的dSYM文件的时候,发现该文件已经被删除了。如果系统把开发者提交到Appa.如果在2个小时内没有收到任何与当前dSYM文件相关的崩溃报告,b.如果之前有收到若干个与当前dSYM有关的崩溃报告,但是最近2个2.Release编译(模拟机/真机)a.三个月内没有收到任何与当前dSYM文件相关的崩溃报告,那么给当b.之前有收到与当前dSYM文件相关的崩溃报告1)指令集支持●ARM系列2)64比特支持虽然目前大部分的iOS设备都是32位处理器,但是2013年推出的iPhone5S将成为首款搭载64位ARM处理器的iOS设备,因此atos需要支持对64比特的DWARFarm,二者皆为小端模式。而目前系统服务器所使用的也是小端模式,但是鉴于未来系统可能运行在各种处理器架构下,所以本系统还解决了大端模式下的Mach-O/DWARF解析问题。由于atos工具过于底层,因此本系统选择使用C语言进行开发,但是使用C语言就涉及到内存的回收利用,所有的malloc都必须对应一个free,经过一系列的测试研究,终于解决了所有的内存回收问题。但是由于atos程序只用来进行符号化过程,而在程序结束的时候操作系统会自动回收相应的内存,因此即使有内存泄露也不会有很大的问题,但是本着优雅退出的原则,本系统还是对内存泄露问题进行测试,确保不会有内存泄露问题。由于C语言写代码容易出错,而且atos进行的都是底层的操作,因此大部分情况下atos运行时都需要进行一部分输出以便调试,但是由于符号化脚本是通过读取atos标准输出的方式获得符号化结果,如果atos直接在命令行输出调试信息会影响符号化脚本的解析。因此使用过程中经常需要在二者之间切换。为了解决这个问题本系统通过使用宏的方式实现了调试模式,编译的时候加上-DDebug标志就可以生成调试模式下的可执行文件,不加的话生成Release版本,此时会把所有的调试信息删除,只输出最后的符号信息。Pier为本系统提供业务逻辑以及崩溃展示服务,用于实现用户注册、崩溃信息展目标Pier子系统需要提供Web界面及相应的后端逻辑代码从而实现一般用户操务逻辑:●用户相关业务逻辑:用户注册、用户邀请、用户信息更改、用户删除、用户角色等功能。●应用程序相关业务逻辑:应用程序创建、应用程序删除、应用程序设置等功●崩溃显示相关业务逻辑:展示崩溃统计信息,崩溃分组信息、崩溃堆栈信息Web技术实现相应的后端逻辑。Pier代码风格需要遵守Python语言开发风格,做到代码简洁、易于维护。3.3.5Mussel子系统周内的崩溃报表,一个月内的崩溃报表等。目标Mussel系统要能根据用户需要实时产生各种统计信息,并确保分布式扩展性和高可用性。Mussel子系统使用Elasticsearch作为底层的统计分析框架,接收Crab系统发送系统获取及展示。业务算法逻辑使用Python编程语言调用ElasticsearchAPI对Elasticsearch中的数据进行操作。●当用户在Pier端创建应用程序的时候自动在Elasticsearch中生成一个新的数据Index(类似传统数据库中的数据库)用于存储所有与该应用程序有关的统计信息,当用户删除该应用程序时自动删除Elasticsearch中该应用程序对应Index中的所有数据,删除后的项目若仍然有崩溃进来,直接丢弃。●对于每个应用程序,还需要根据筛选条件生成条件下的崩溃总数、影响设备数,各操作系统版本下的崩溃分布等统计信息,从而让用户更好的理解崩溃的统计分布情况。代码特性Mussel代码风格需要遵守Python语言的开发风格,做到代码简洁、易于维护。3.3.6子系统数据交互本系统的实现过程中还涉及各子系统之间的数据交互,其数据交互过程如图3.3和图标溃日报数翁缴接鬟套崩溃XML图3.3系统数据流图首先,开发者嵌入ConchSDK并且进行编译,MacAppHairtail把对崩溃分析必留待下次收到崩溃时使用。将连接Crab子系统,把崩溃报告发送给Crab子系统。Crab子系统收到崩溃报告后,对原始的崩溃报告内容进行解析,崩溃报告内容见附录1,根据从崩溃报告中得到的数据特征(如文件名和行号、方法和方法偏移等)对崩溃进行聚类分组,并且把业务首先开发者通过Pier进行用户账号注册,并且新一个项目,安装HairtailMacApp。1)崩溃收集会生成一个崩溃信息文件,存储在用户的设备上。2)崩溃的发送3)崩溃的处理溃报告。4)崩溃的分析提醒。5)崩溃的统计给开发者。6)崩溃的展示本课题所期望的成果是一个方便好用、完善的崩溃收集与处理系统。其中包括以下5个子系统:供开发者嵌入应用程序中,开发者在应用程序中加入一小段代码及少量的配置。应用程序崩溃后,SDK会自动保存崩溃堆息,寄存器状态、崩溃原因等信息。在用户下次打开应用程序,网络可用的情况下自动发送崩溃报告给Crab子系统。第二个是Hairtail子系统,开发者从本系统Pier端网站下载安装Hairtail后,每次开发者使用Xcode编译iOS应用程序,Hairtail都会自动保存崩溃符号化所必须的dSYM文件并且上传到Crab子系统,用于之后的符号化过程。第三个是Crab子系统,用于崩溃信息的输入。功能如下:1.接收开发者开发机发送的dSYM文件,进行预处理分析后存入文件系统。2.接收SDK发送的崩溃报告,启动一个后端任务分析此崩溃。3.后端任务解析崩溃报告,从中抽取所有的二进制地址,调用符号化脚本进行符号化,得到目标崩溃报告。符号化的结果使用缓存服务进行缓存,以加快4.对崩溃堆栈进行分析,例如,高亮用户代码行,按照文件名和行号进行聚类5.定期进行数据清理,去除老旧的dSYM文件和崩溃报告,节省服务器端资源。第四个是Pier子系统,用于用户注册、用户邀请、崩溃展示等业务逻辑。第五个是Mussel子系统,作为统计服务,用于生成崩溃统计信息。相互协同工作的方式,并在结尾处对系统业务流程和预期成果做了分析与阐述。第4章对汽轮发电机电指计算程序进行修正本章将对系统实现时使用的一些关键技术以及系统实现时用到的相关资源进行4.1关键技术代码中的Bug并对崩溃的总体情况有所了解。系统SDK收集崩溃信息和崩溃统计信息后对崩溃堆栈进行客户端符号化,并把崩溃报告标准化为Apple官方崩溃报告格式。最后SDK把该崩溃报告发送给系统服脚本对崩溃进行符号化并且对符号化之后的崩溃和Web页面展示的方式显示给开发者。本系统使用PLCrashReporter开源框架来收集iOS应用程序的崩溃信息和崩溃统计信息并对崩溃堆栈进行客户端符号化,在对后使用HTTP连接把崩溃报告发送给服务端进行统计分析。在本系统中由Conch子本系统使用客户端本地堆栈符号化与服务端实时堆栈符号化相结合的方式对崩首先SDK在iOS设备尽可能多的进行符号化过程,对于客户端本地不能进行符号化或者由于隐私问题不能得到相应符号的二进制地址采用服务端实时符号化的策略。在服务端接收到崩溃报告后,如果发现某些位置需要进行符号化(例如:需要在服务端使用dSYM符号化出文件名和行号、客户端由于iOS隐私保护不能得到的符号),则调用服务端符号化过程,并且把符号化的结果替换崩溃报告中的相应位置。原始崩溃报告和结果崩溃报告分别见附录1和附录2。由于iOS与MacOSX高度整合,Linux操作系统常用符号化工具并不能处理Mac操作系统的Mach-O格式文件,因此本系统需要实现一个能在Linux操作系统上符号化iOS调试信息文件的工具。该工具的实现需要理解Mach-O文件格式和DWARF文件格式。首先从命令行参数中确定需要解析的文件及相应的架构,从Mach-O文件中抽取DWARF相关部分,并且进行解析之后,使用命令行参数确定需4.1.4聚类统计分析进行统计分析。例如,把所有同一个源文件里面的崩者根据源文件进行任务分割。通过这类聚类方式可以帮助开发者对代码有整体的了解,从而在适当的时候对存在Bug的源文件进行修改甚至重写。同时本系统还对崩的背景环境有一定的认识,给开发者尽量多的崩溃元信息。影响的设备数量。为了统计崩溃影响的设备数标识符对该设备进行标识。本系统采用了一个开源的实现SecureUDID¹1框架,使用同一台设备的不同应用程序生成的标识符是不一样的,这样既保护了设备隐私也可以由于系统atos工具的时候需要解析Mach-O结构,因此对Mach-统,如NeXTSTEP,MacOSX和iOS。IPA文件是MacOSX系统下的一个Bundle,即一个目录,但是这个目录被Mac特指IPA文件中的Mach-0文件。使用Xcode编译iOS应用程序时会产生2个Mach-O文件,一个是包含在IPA中的可执行文件,另一个包含在dSYM中的DW或函数的符号信息,但是如果想更进一步找到行号和文件名的话,那么必须使用iOS平台上的DWARF调试信息外层是用Mach-O格式封装,这与一般的DWARF格式不同,iOS中把一般DWARF格式中的各个部分都被抽取出来放到了Mach-O格式中不同的位置。所以dSYM文件是DWARF和Mach-O结构的混合体,因此系统不能使用Linux下传统的DWARF格式解析工具解析dSYM文件。4.2.2Mach-O文件结构在每一个Mach-O[12]的起始处都会有一个文件头,标识当前文件是否为一个Mach-O文件,这个文件头还包含了其他基本的文件类型信息,指示了文件的目标架构,并且包含了影响文件解析过程的一些选项标识。结构如下:{cputype:指定本文件适用的架构,包括:●CPU_TYPE_POWERPC:用于基于PowerPC的架构。cpusubtype:指定处理器的确切模型。filetype:指定文件类型和对齐方式的整数,可以使用如下值:●MH_OBJECT:中间格式文件的格式。●MH_BUNDLE:运行时加载的代码,如动态运行库。●MH_PRELOAD:特殊用途的不被OSX内核加载的可执行文件,如:写2.符号表的位置(用于动态链接)。4.主可执行文件引入的符号所在共享库的名称。cmd:指定LoadCommand的类型。关于LoadCommand的类型,见附录3。cmdsize:指定LoadCommand数据结构占用的字节数。不同的LoadCommand接着LoadCommand之后是一个或多个Segment的数据,系统需要这些Segment中。每个Segment包含0个或多个Section,Mach-O文件包含了对应于某个架构的代码和数据。Mach-O头结构指明了目标的架构。这样操作系统内核就能根据系统实际架构对文件进行选择性加载。Segments和Sections是通过名称来访问的。根据传统,Segments使用两个下划线开头跟上多个大写字母,例如:_TEXT。Sections也是使用两个下划线开头,但是是以小写字母命令,例如_text。如果一个可执行文件或者调试信息文件仅支持一种架构,那么它应该是Thin格由于Mac操作系统换过多次硬件架构,例如,刚开始使用了PowerPC,后来才不同的系列,如ARMV5、ARMV6、ARMV7。Apple为了用户的一致性体验,如果一个应用程序同时支持ARMV5、ARMV6处理器下运行,那么Xcode中就会把这两种架构下的代码放在一起组合成一个Fat格式的Mach-O文件。FatMach-O是个复合Mach-O,头部指明了包含的若干ThinMach-O的信息,紧随着是若干个ThinMach-O一致,用于区分两种格式,如图4.2,4.3所示。4.3.1DIE基本信息介绍包含0个或多个子DIE,并且可能包含0个或多个兄弟DIE。能的取值一般包含一类或多类属性值形式,每一个属性形式可能会以一种或多种形式表示。例如,一些属性值由一些“常量数据”表示。而此处“常量数据”是该属性所包含的属性类别的一种。常量数据有多种表示方法(例如,1字节,2字节,4字节,8字节)。表4-1[13]为每个属性可能可能的取值类型及介绍:指向了程序地址空间中的地址。任意数量字节的未翻译的数据、1字节、2字节、4字节或者8字节的未翻译或者以LEB128编码的可变长度数据。一个比较小的指示属性存在与否的标志。指向一些描述本程序的DIE集合的一些成员。有2种类型的reference。第一种是相对于reference所在的编译单元(CompilationUnit)开始位置的偏移,并且指向了本编译单元中的一个DIE。第二种是指向本可执行文件或者共享目标文件中的DIE的地址。它可能指向当前程序中的另一个不同的编译单元。以Null结尾的一个或多个字节,存储在这里面的一般都是可打印的字符串,字符串可能会直接表示在DIE中整的结构。1)编译单元编译单元[13]的常见属性如下表所示:表4-2编译单元DIE常见属性…各属性的作用如下:DW_AT_language:表示编译单元对应的源代码所用编程语言的常量。如下所示:●...在DIESection中,属性值是本编译单元行号信息的第一个字节在debug_lineSection的偏移。DW_AT_identifier_case:表示本编译单元对标识符大小写的处理,包括:DW_AT_base_types:属性值是一个引用,指向另一个编译单元的DIE,可以被用来指定包含当前编译单元用到的一些basetype所在的编译单元。2)模块…DW_AT_name:在模块有名字的情况下,模块DIE会有此属性,用于存储模块储模块初始化代码第一条机器指令的可重定位地址。DW_AT_high_pc:在模块有初始化代码的情况下,模块DIE会有此属性,它的值指向了初始化代码最后一条机器指令的下一个位置的地址。DW_AT_priority:如果一个模块有优先级,模块DIE可能会有此属性,属性值指向另一个用常量值描述一个变量的DIE,变量的值就是模块的优先级。3)子程序子程序DIE的Tag是DW_TAG_subprogram,用于存储程序中的方法或者函数信…DW_AT_external:如果子程序在本编译单元之外依然可见,那么有此属性,属DW_AT_type:表示子程序的返回值类型。DW_AT_low_pc:它的值指向了子程序第一条机器指令的可重定位地址。DW_AT_high_pc:它的值指向了子程序最后一条机器指令下一个位置的地址。介绍完DWARF的几个基本概念之后,我们就比较方便理解DWARF中的Section的概念。DWARF包括以下几个重要的Section。 debugabbrevSection中包含所有TAG的定义,每个TAG都有不同的编号。这样在别的Section只需要通过TAG编号就能确定DIE的类型。 debuginfoSection中存储了目标代码的DIE树状结构。每个EntrySet描述了某编译单元所在程序地址空间的一部分。每一个Set由一个包含5个值的头部开始。该头部包含以下5个值:1.除该头部以外的其他部分的总长度。2.版本号。3.该Set指向的编译单元对于_debug_infoSection开始位置的偏移。4.地址在目标架构上所占的字节数。对于分段寻址,这个是地址偏移部分的大5.目标架构上段描述符的字节数,如果目标系统是平坦地址空间,这个值将是描述符由对应的编译单元DIE包含的某个Entry正文和数据范围的开始地址及那个范围的长度。这些描述符由一个空描述符结尾(开始地址和长度都是0),通过扫描这张表,调试器可以决定去查看哪一个编译单元去查找具有相应地址的对象的调试信息为了把源代码文件中的语句和可执行文件/共享文件中的机器指令地址对应起Section中的编译单元DIE会有对这个Section的引用,从而把编译单元和相应的源代4.3.4源文件信息相关结构1.源文件名2.源文件行号3.源文件列号4.指令是否为源代码语句对应的第一条指令5.指令是否是基本代码段的开始但是这样一个矩阵将会占用大量的硬盘空间,因此DWARF的设计者使用了2矩阵。因此当调试器需要把机器码和源文件语句●基本代码块:只在第一条语句进入、最后一条语句退出的一系列指令。●Sequence:一系列连续的目标机器指令。一个编译单元可能会产生多个序列(即在一个编译单元中并不是所有的指令都是连续的)。始化时,寄存器并不是被简单的赋值为0,而是由DWARF中的StatementProgramPrologue中定义的值来初始化,从而实现了初始状态的可配置化。状态机能识别的指令就是上文提到的StatementProgram。下文将介绍状态机的寄存器、Statement状态机中包含如下几个寄存器:-address寄存器:编译器产生的机器指令对应的PC值,初始值为0。-line寄存器:一个无符号整数,指示了行号信息。行号从1开始。如果某个指令无法找到对应的源文件行,那么可以返回0。初始值为1。-column寄存器:一个无符号整数,指示了语句对应的源文件行的列号。列号从1开始计数。如果一个语句从行的左边界开始,那么返回0。-is_stmt:指示当前指令是否是语句起始位置。初始值由default_is_stmt值确-basic_block:指示当前语句是否是基本代码块起始位置。初始值为“false”。-end_sequence:指示当前地址是否目标机器指令序列的结尾之后的第一个字节。初始值为"false"。佳的效果。DWARF的作者使用StatementProgramPrologue来提供这类配置。优点如(某类状态机指令)的空间范围是10-255,但是如果编译器开发者加了一个新的standardopcodes,那么specialopcodes的下界就会增加。所以DWARF的设计者才会选择使用StatementProgramPrologue中的opcode_base域来表示第一个spec2.根据目标架构的不同,specialopcode意义的最佳选择是不同的。-version(uhalf):StatementInformation格式的版本标识符。-prologue_length:prologue_length域之后直到StatementProgram本身第一个字节之前的字节数。-minimum_instruction_length(ubyte):最小目标机器指令的字节数。修改地址寄存器的操作符会把其操作数乘以这个值。-defaultisstmt(ubyte):isstmt寄存器的初始值。一个简单的以源代码程序暗矩阵的每一个条目都代表了语句边界。一个管道调度代码生成器会把这个值设置为"false",并且会为每一个代表语句边界的指令产生一个特殊的操作符。line_base(sbyte):此参数影响了specialopcode的含义,指定了specialcode加到line寄存器的最小值。-line_range(ubyte):此参数也影响了specialopcode的意思,指定了加到line寄存器的值范围。(line_base与line_range决定了能加到line寄存器的最大值,如果想要加到line寄存器的值大于这个最大值,那么必须使用一个standard-opcode_base(ubyte):指定了第一个specialopcode的值。-standard_opcode_lengths(arrayofubyte):为每一个standardopcode指定了操作数的个数。-include_directories(一系列路径名):这个序列包含了编译过程中搜索源文件的所有路径(包括用户显示指定和编译器默认搜索的路径)。每一个路径都是绝对路径或者相对于编译时工作目录的相对路径。编译时的当前目录是本序列的第一个条目。每一个条目字符串都以空字符结尾。最后一个条目是一个单独的空字符。-file_names(一系列文件名):对于每一个对当前编译单元下的StatementInformation有贡献的源文件在这个序列中都会对应一个条目。每个条目都有StatementProgram用于在状态机执行并创建一个代表对应编译单元的矩阵。每一个编译单元的StatementProgram都以一个StatementProgramPrologue开始,用于对状态机进行配置。StatementProgram由状态机指令构成。由于状态机是一个简单的机器,其语句很资料来源:DWARFDebuggingInfor功能如下:b.用一个无符号整数乘以StatementProgramPrologue中指定的minimum_instruction_length字段,并且把结果加到address寄存器中。c.使用状态机寄存器的当前值给矩阵加一行。d.把basicblock寄存器设置为"false"。所有specialopcodes都只做以上4件事情,唯一的不同就是给line和address寄数以及参数的含义,StatementProgramPrologue也指明了每一个标准操作码的目前有9个StandardOpcodes,未来可以通过增加opcode_base的方式增加行,并且把basic_block寄存器设置为"false"。b.DW_LNS_advance_pc:操作数为一个无符号LEB128操作数,把该操作数乘以StatementProgramPrologue中的minimum_instruction_length,并把结果加到address寄存器中。值加到line寄存器中。file寄存器中。e.DW_LNS_set_column:器进行设置。g.DW_LNS_basic_block:没有操作数,把basic_block寄存器设置为“true”。h.DW_LNS_add_pc:没有操作数,把address寄存器的值加上special用1字节的specialcode,要增加这个范围的两倍的时候,使用DW_LNS_advance_pc和一个spi.DW_LNS_fixed_advaopcode是否溢出,并且需要使用DW_LNS_advance而不能产生3.扩展操作指令(extendedopcodes):这类指令包含多种字节形式。第一个字节是0。另一个是无符号LEB128整数,给出了指令的字节数(不包括第一个0字节和Size字节)。接下来的字节就是指令本身。用状态机当前值增加一行并且把寄存器都设置为初始值。每一个StatementProgramSequence都必须以DW_LNE_end_sequence指令结c.DW_LNE_define_file:需要四个操作数,第一个是一个包含原文件名表了字节数的无符号LEB128整数。地址的递进是通过把目的的地址增加量除以ProgramStatementPrologue的opcode。如果最后的值大于255,那么必须使用standardopcode¹3]。解码opcode把specialcode减去opcode_base后再除以line_range后的值加到address寄存器●bdb代码我们同样可以在MacOSX操作系统下的`/u在atos工具的实现过程中,需要读取Mach-O内部的DWARFSegment,因此需该工具用于查看Mach-ODWARF结构内容,以人可读的形式展示Mach-O中的第5章应用软件设计进行介绍,其中包括Conch子系统、Hairtail子系统、Crab子系统、Pier子系统以及Mussel子系统的实现过程的介绍。本章还对各个子系统的整合方式进行了介绍。5.1软件间的接口技术Conch子系统是崩溃收集SDK,使用Objective-C编写,供开发者嵌入到iOS应5.1.1VisualBasic与Matlab的接口技术5.1.2VisualBasic与Excel的接口技术生时的网络状态,电池状态,语言环境等。前文提到,由于进程崩溃时,进程的堆栈可能已经破坏,在程序崩溃后只能调用一些Async-Safe的函数,因此不能调用iOS系统库。为了获得这些信息,需要在程序开始运行的时候注册一些设备状态监听器,每当设备状态改变时就去获取最新的设备状态,并且写入iOS设备存储空间,在用户下一次打开程序的时候去读取存储空间里的文件内容,并且在合适的时候通送给Crab子系统。关键技术中提到系统需要获取设备标识符(UDID,SecureUDID)用于统计受影响初,Apple支持在iOS中使用UDID唯一确定一台iOS设备,但是后来由于隐私问题在新版iOS中被禁用。如果开发者应用程序使用了UDID那么将导致开发者应用程序不能在AppStore上架。5.1.3VisualBasic与AutoCADPLCrashReporter收集的崩溃信息以一个二进制文件的形式存放在iOS设备中,客户端代码通过调用PLCrashReporter的API去从该二进制文件中抽取程序崩溃时的上下文信息来构造Apple官方标准崩溃报告格式,其中包括:处理器型号、操作系统版本、所有线程状态、寄存器状态、地址空间等。如附录1所示。其中所有的线程中只有一个线程是当前的崩溃线程并且每个线程都有相应的调用堆栈。如下所示:2TestDemo0x000右侧的十六进制数即为符号化过程需要进行转换为符号的的二进制地址。5.1.4VisualBasic与Ansoft/Ma调用PLCrashReporterAPI生成Apple官方标准的崩溃报告后,需要通过iOS的HTTP连接把该崩溃报告发送到Crab子系统,并且查看返回值,如果返回值为成功,那么就把该崩溃报告从用户的设备上删除,否则等待下次重新发送传。为了最大限度的减少因为内嵌Conch给开发者应用程序造成的额外负载,系统使用了iOS的异步队列,使用GCD创建不同优先级的工作队列,结合Block的使用,方便快捷的实现异步处理逻辑,通过给崩溃上传线程设置较低优先级,实现最低限度的上传负载。Hairtail子系统用于从开发者开发机上传dSYM文件、应用程序图标文件和其他Crab子系统,由Crab子系统进行解析。5.2.2额外信息获取一为iDevices真机编译关于dSYM文件的上传,系统最开始的做法是编写一个Shell脚本,让开发者给项目增加一个BuildPhase,从而添加一个RunScript,这样开发者每次编译完都会去脚本是同步执行的(如果使用后台运行的方式Hairtail就无法跟踪上传的结果),Shell脚本的执行会占用较长时间,而且在Shell脚本通过CURL上传dSYM文件时,开发者不能做任何事情,这样影响了开发者体验和开发效率。编译时都会通过Shell脚本调用一个启动程序Lay,Lay去检查当前Hairtail是否正在运行,如果没有,就去启动Hairtail。Hairtail每隔2秒就会去前文提到的dSYM的标准路径去扫描dSYM是否发生改变(通过比较最近修改时间和MD5值),如果没有是一个Bundle,因此在上传时需要对该文件进行压缩,并且在上传时指定AppToken (这样才能确定该dSYM文件所属的应用程序)和dSYM文件的额外信息。如果5.3所示系统Hairtail子系统的MacOSX下的应用程序图标,图5.4左侧第一个图标为Hairtail在系统状态栏的图标,可以通过双击应用程序图标启动该程序或者由Xcode编译时自动启动,启动后,每当发现特定目录中出现新的dSYM就会自动上传到Crab子系统,在上传时,状态栏图标会闪烁。Crab子系统作为崩溃收集的服务端,接受Conch发送的崩溃报告以及Hairtail发送的dSYM文件,在服务端做分析。本子系统使用Python作为开发语言,Python下有很多很好的Web框架,其中比较有名的有Django、web.py、Pyramid等。笔者选择了使用Pyramid作为开发框架,因为它小巧,结构简单,容易使用。Pier子系统的功能包括用户注册、用户邀请、添加应用程序、查看应用程序崩溃信息等。本子系统主要使用HTML、CSS、JavaScript进行前端页面开发,使用Python编程语言进行后端逻辑代码编写。个灵活的强大的开源分布式云实时搜索和分析引擎,Elasticsearch的特点。实时性:实时性在一个涉及到统计分析的系统中十分重要,因为不断的有数据通过系统的业务逻辑进入系统,通过使用Elasticsearch这部分数据实时可用。实时分析:使用了Elasticsearch后,搜索不在只是纯文本搜索,Elasticsearch会首先去读懂数据,从而更好的分析数据。分布式:Elasticsearch允许起初以很有限的配置启动业务,随着业务的增长可以实现水平地扩展业务。每当需要更多的容量,只需增加更多的结点。Elasticsearch机器簇会自动重组系统结构,使用新加入的硬件结点。进行隔离,确保数据的安全可访问性。多存储:一个Elasticsearch族可以存储多个Index(每个Index类似一个传统数据库中的数据库),每一个Index都可以被单独的查询或者以组的形式查询。全文本搜索:Elasticsearch底层使用Lucene提供了很强大的全文本搜索功能,支持多种编程语言(本系统中使用了Python编程语言),支持一个强大的查询语言(类文档面向:真实世界的实体以JSON文档的形式存储在Elasticsearch中,传递进来的JSON文档的每个字段都可以被索引,并且在一个简单的查询中支持同时查询多个Index。冲突管理:Elasticsearch支持优化的版本控制,从而确保即使数据存在冲突,数据也不会由于冲突的存在而丢失。RESTFULAPI:Elasticsearch是API驱动的,几乎所有的操作都可以以简单Elasticsearch还包含一个Mapping的概念,类似于传统数据库中的Schema定义。每一个Index都有一个Mapping,Mapping中不仅定义字段的类型,还定义了字段的索引属性和索引规则。Mapping可以被显示定义也可以在传递JSON字符串的时候自5.4.2定转子工程图Mapping中最为重要的就是定义每个字段的索引属性和存储属性,从而当接收到由Crab发送的JSON字符串之后就可以确定对该字符串的所有字段所执行的处理操作。以下代码为从Crab截取的一小部分代码。long_not_index={index':'no','store'long_index_store={'store':'yint_not_index={'index':'no','store':'yint_index_store={'store':'yebyte_index_store={'store':'yes','type':'istring_not_index={index':'no','string_not_analyzed={'index':'not_analyzed'string_not_analyzed_store={'index':'not_analyzeddate_index_store={'store'}其中store域用于表示该域是否真正存储在Elasticsearch的Index中,如果设置为不存储在Index中,那么通过直接去JSON字符串中读取的方式去读取该字段。index域用于设置字段索引属性,设置为“analyzed”可使该字段被索引,可以被搜索到并且字符串中的内容进行分析或解析,因此对于文中的字符串字段都设置为5.4.3有限元分析一键求解功能的实现种位同质末全近一烹嵌话一最通中个月最近一舞6新增应用分话5图5.11统计信息图了Circus[22]工具管理所有的服务。本文对iOS应用程序崩溃信息收集与处理系统的总体设计、详细设计、使用的工作,最终达到了项目预期成果,真正实现了iOS程序崩溃的自动收集与上传,服务待提高。速发展,崩溃信息统计必将一直服务所有的开发者。[1]UMengTeam.UMeng官方网站介绍[EB/OL].,2013/2013-09-29.[2]BaiduTeam.Baidu官方网站介绍[EB/OL].,2013/2013-09-29[3]CrashlyticsTeam.Crashlytics官网介绍[EB/OL].,[4]HockeyappTeam.Hockeyapp官网介绍[EB/OL].,2013/2013-09-29.[5]AndreasLinde.QuincyKit2012/2013-09-29.[6]TestFlightTeam.TestFlight官方网站.[EB/OL].https://testf[7]PlausibleLabs.PLCrashReporter[8]FabricTeam.Fabic官方网站.[EB/OL].,2013/2013-09-29.[9]Oliver.MakingYourOwniPhoneFrameworks.[EB/OL]./2010/05/making-your-own-iphone-framewor2010-05-23/2013-09-29.[10]CeleryTeam.Celery官方网站.[EB/OL].,2013/2013-09-29./blog/category/secureudid,2012-12-23/2013-09-29.http://developer.A/library/mac/#documentation/DeveloperTools/Cntime/Reference/reference.html.2009-02-04/2013-09-29.[EB/OL].http///doc/dwarf-2.0.0.pdf,1993-07-27/2[14]Mach-OView开发者.Mach-OView文件下载网站.[EB/OL]./projects/machoview/,2013-01-10/2013-09-29.[15]Mach-OLib开发者.Mach-OLib代码下载网站.[EB/OL]./pypi/macholib/1.5.1,2013-02-04/2013-09-29.[16]AppleTeam.dwarfdump工具使用文档.[EB/OL].http://developer.A/library/mac/#documentation/Darwin/Referencerfdump.1.html,2000/2013-09-29.[17]AppleTeam.binutil工具源代码.[EB/OL]./source/binutils/binutils-20/src/2013-01-29/2013-09-29.[18]AaronBallman.Callonlyasynchronous-safef/confluence/display/seccode/SIG30-C.+Callus-safe+functions+within+signal+handlers,2007-06-10/2013-09-29.http://developer.A/library/mac/#documentation/DeveloperTools/ReSettingRef/1-Build_Setting_Reference/build_setting_ref.html,2010-10-05/201/post/11322114068/real-time-s2012-10-11/2013-09-29.[21]ElasticsearchTeam.Elasticsearch官方网站.[EB/OL].,2013/2013-09-29.[22]CircusTeam.Circus官方网站.[EB/OL]./,2013/2013-09-29.附录样例原始崩溃报告:IncidentIdentifier:BADAA5AF-BOF1-4CAB-B7FF-15F8214AE1ABPath:/Users/USER/MyTryConch.app/MyTryConchDate/Time:2013-06-1501:31:56+0000OSVersion:iPhone***Terminatingappduetoun0CoreFoundation1libobjc.A.dylib0x3a539963_objc_e2CoreFoundation0x3278921d3MyTryConch0x00093b6b-[QDCViewControlle4MyTryConch0x00093c65-[QDCViewControllersendCrash2:]+735UI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论