真香!iOS云真机全新上线!

作者:WeTest小编商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。原文链接:https://wetest.qq.com/lab/view/434.htmlWeTest 导读众多开发者已经渐渐适应通过调用线上的安卓真机进行远程调试,但是针对iOS设备,则依然存在“iOS设备昂贵”“无法及时采购iOS最新设备”“无法复现iOS历史系统版本”等问题。为了帮助开发者解决这一困扰, WeTest的iOS云真机正式上线了!!!iOS机型及系统列表一、全新iOS版本,覆盖不同系统WeTest上线的iOS设备中,除了市场主流的iOS机型,考虑到像邮箱类的应用对低系统版本设备也有测试需求,所以WeTest也增加了不同iOS机型的不同系统版本。使用者们可以在导航栏的筛选功能里选出自己想要的操作系统。二、还原真机操作,定位“刘海屏”适配问题设备支持多点触控,保留iOS辅助触控功能,贴近真实手机的操作。针对今年突出的 “刘海屏”适配问题,在左侧设备显示界面上,还原刘海屏显示,让开发者们能检验“刘海屏”问题做适配。并在测试过程中可以切换横竖屏显示。三、实时日志,精准读取数据在使用iOS云真机时,右侧会同步显示实时日志情况,方便开发者查看App运行时的日志,准确定位问题。四、截图查看,完整反馈在测试过程中,提供截图功能,可以保留关键图片附在报告里,便于不同人员之间的流转。五、安装说明在上传安装ipa包的时候,请注意以下几点:1.企业证书签名的ipa包,需要在描述文件中信任。2.个人证书签名的ipa包,可以参考【iOS云真机调试】一栏,添加测试设备的UDID。签名方式:打开苹果官方开发者网站将设备的UDID加入到对应的“Devices”列表中打开本地Xcode使用 同一账号密码登录工程下General的Signing中,配置签名“iOS云真机”现已对外,和真实手机一样的好用。点击:https://wetest.qq.com/product/cloudphone?from=content_lab 即可体验。如果使用当中有任何疑问,欢迎联系腾讯WeTest企业QQ:2852350015

January 3, 2019 · 1 min · jiezi

代理本地服务到公网—natapp内网穿透工具

本文属于原创文章,转载请注明–桃源小盼开发一些服务时,想把本地服务映射到公网可访问状态,方便开发调试。适合调试微信小程序,混合型app客户端等本工具免费稳定,也有高级付费版注册下载打开https://natapp.cn购买免费型下载客户端修改客户端权限cd 下载目录chmod a+x natapp普通使用配置本地地址 127.0.0.1配置本地端口 8080复制authtoken运行客户端// 运行客户端,出现online代表已通./natapp -authtoken=复制的authtoken额外配置// 如果使用了webpack,增加配置devServer: { disableHostCheck: true // 绕过主机检查}高级使用-固定域名购买付费服务,多种可选域名服务下增加一条CNAME解析将已备案域名绑定到natapp

December 13, 2018 · 1 min · jiezi

Linker加载so失败问题分析

作者:段聪,腾讯社交平台部高级工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。原文链接:https://wetest.qq.com/lab/view/421.htmlWeTest 导读近期测试反馈一个问题,在旧版本微视基础上覆盖安装新版本的微视APP,首次打开拍摄页录制视频合成时高概率出现crash。那么我们直奔主题,看看日志:另外复现的日志中还出现如下信息:’/data/data/com.tencent.weishi/appresArchiveExtra/res1bodydetect/bodydetect/libxnet.so: strtab out of bounds error后经过测试,发现覆盖安装后首次使用美体功能也会出现crash,日志如下:由于出现问题的场景都是覆盖安装首次使用,并且涉及到人体检测相关的so,似乎存在某种共同的原因。因此Abort异常比起fault addr类问题更容易分析,先从前面Linker出现Abort异常的位置开始着手。Linker是so链接和加载的关键,属于系统可执行文件,因此分析起来比较棘手。好在手上正好有一台刚刷完自己编译的Android AOSP的Pixel,做一些实验变得更轻松了。出现异常的Linker代码linker_soinfo.cpp如下:const char* soinfo::get_string(ElfW(Word) index) const { if (has_min_version(1) && (index >= strtab_size)) { async_safe_fatal("%s: strtab out of bounds error; STRSZ=%zd, name=%d", get_realpath(), strtab_size_, index); } return strtab_ + index;}bool soinfo::elf_lookup(SymbolName& symbol_name, const version_info* vi, uint32_t* symbol_index) const { uint32_t hash = symbol_name.elf_hash(); TRACE_TYPE(LOOKUP, “SEARCH %s in %s@%p h=%x(elf) %zd”, symbol_name.get_name(), get_realpath(), reinterpret_cast<void*>(base), hash, hash % nbucket_); ElfW(Versym) verneed = 0; if (!find_verdef_version_index(this, vi, &verneed)) { return false; } for (uint32_t n = bucket_[hash % nbucket_]; n != 0; n = chain_[n]) { ElfW(Sym)* s = symtab_ + n; const ElfW(Versym)* verdef = get_versym(n); // skip hidden versions when verneed == 0 if (verneed == kVersymNotNeeded && is_versym_hidden(verdef)) { continue; } if (check_symbol_version(verneed, verdef) && strcmp(get_string(s->st_name), symbol_name.get_name()) == 0 && is_symbol_global_and_defined(this, s)) { TRACE_TYPE(LOOKUP, “FOUND %s in %s (%p) %zd”, symbol_name.get_name(), get_realpath(), reinterpret_cast<void*>(s->st_value), static_cast<size_t>(s->st_size)); symbol_index = n; return true; } } TRACE_TYPE(LOOKUP, “NOT FOUND %s in %s@%p %x %zd”, symbol_name.get_name(), get_realpath(), reinterpret_cast<void>(base), hash, hash % nbucket_); symbol_index = 0; return true;}从代码上看,是在so的symtab中查找某个符号时ElfW(Sym) s的地址出现异常,导致s->st_name获取到错误的数据。通过复现问题,可以抓到更完整的 /data/tombstone日志,得到如下完整的信息:尽管从tombstone中我们可以看到一些寄存器数据及寄存处地址附近内存数据,同时也可以看到crash时的虚拟内存映射表,仍然无法获取有价值的信息。另外通过几次复现,发现并不是每次Crash都是SIGABRT,也出现不少SIGSEGV信号,而调用栈和之前都是一样的,比如这个:这基本上可以说明,并不是so本身的代码存在异常,只可能是加载的so出现了文件异常。另外通过在linker中增加日志,并重新编译linker替换到/system/lib/linker中:可以获取到如下的地址信息:通过根据tombstone中的/proc/<poc>/maps的虚拟内存地址与日志打印的地址进行对比,可以发现最为符号表地址的s并没有指向so文件在虚拟内存中的地址段,因此可以怀疑,so加载确实出现了异常。因为手机root,可以直接获取到crash时的so文件(adb pull /data/data/com.tencent.weishi/appresArchiveExtra/res1bodydetect/bodydetect/libxnet.so),导出来对比md5,然而发现与正常情况下的so是一模一样的:既然前面的这些实验都没有得出什么有意义的结论,那么我回过头来分析一下,与问题关联的so加载到底有什么特殊性。实际上,微视为了减包,将一部分so文件进行下发,由于so也处于不断迭代的过程中,新版本的微视可能会在后台更新so文件,那么客户端一旦发现新的版本有新的so,就会去下载so并进行本地替换。那么这个过程有什么问题呢?唯一可能的问题,就是先加载了旧的so,之后下载新的so进行了热更新。我们先看下微视中是否有这种现象。要观察这种现象,我们可以打开linker自身的调试开关,开启so加载的日志。通过设置系统属性,我们可以很容易地进行开启LD_LOG日志:adb shell setprop debug.ld.all dlerror,dlopen当然我们也可以只针对某个应用开启这个日志(设置系统属性debug.ld.app.)。另外,为了开启linker中更多的日志,比如DEBUG打印的信息等,我们只需要在adb shell中设置环境变量:export LD_DEBUG=10那么,我们重新复现问题,可以看到如下so加载过程:这个过程表明:旧的so先被加载了,然后下载了新版本的so,并进行了替换。这个过程有什么问题呢?根据《理解inode》一文我们可以得知,linux的文件系统使用的inode机制支持了so文件的热更新(动态更新),即每个文件都有一个唯一的inode号,打开文件后使用inode号区分文件而不是文件名:八、inode的特殊作用由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。但是问题就出在这里,如果替换文件使用的是cp这样的操作,会导致原来的so文件截断,然后重新写入数据,但是inode并没有更新号,磁盘与内存中的信息出现不一致,这种情况在linux中很常见,比如这篇文章就进行了分析:cp new.so old.so,文件的inode号没有改变,dentry找到是新的so,但是cp过程中会把老的so截断为0,这时程序再次进行加载的时候,如果需要的文件偏移大于新的so的地址范围会生成buserror导致程序core掉,或者由于全局符号表没有更新,动态库依赖的外部函数无法解析,会产生sigsegv从而导致程序core掉,当然也有一定的可能性程序继续执行,但是十分危险。2. mv new.so old.so,文件的inode号会发生改变,但老的so的inode号依旧存在,这时程序必须停止重启服务才能继续使用新的so,否则程序继续执行,使用的还是老的so,所以程序不会core掉,就像我们在第二部分删除掉log文件,而依然能用lsof命令看到一样。还有更深入的解释:Linux由于DemandPaging机制的关系,必须确保正在运行中的程序镜像(注意,并非文件本身)不被意外修改,因此内核在启动程序后会绑定 内存页到这个so的inode,而一旦此inode文件被open函数O_TRUNC掉,则kernel会把so文件对应在虚存的页清空,这样当运行到so里面的代码时,因为物理内存中不再有实际的数据(仅存在于虚存空间内),会产生一次缺页中断。Kernel从so文件中copy一份到内存中去,a)但是这时的全局符号表并没有经过解析,当调用到时就产生segmentfault , b)如果需要的文件偏移大于新的so的地址范围,就会产生bus error。那么问题基本清晰了。我们在回去看看微视的代码,这里下载了so之后直接unzip到原来的路径,并没有先进行rm操作。更近一步,我们自己写个demo测试下刚才的问题(2个按钮,一个加载指定so,一个调用so中的native方法):代码不能再简单了:正常加载so然后执行native方法都是ok的,使用rm+mv替换或者adb push替换也都是ok的,最后再按照错误的方法操作,步骤为:启动app,点击加载so;通过cp命令替换so;点击执行native方法;结果确实是crash了:日志如下,是不是很最开始的日志信息一样呢:到此,我们有两种解决办法:如果so有升级,先不加载旧的so,等新的so下载完成之后再加载;可以先加载旧的so,但是下载了新的so之后,要删除旧的so,再进行替换。引文参考:https://www.cnblogs.com/cnlan…https://www.cnblogs.com/cnlan...http://www.nginx.cn/1329.htmlhttp://www.ruanyifeng.com/blo...https://www.bo56.com/linux%E4…_**目前,“自动化兼容测试” 提供云端自动化兼容服务,提交云端百台真机,并行测试。快速发现游戏/应用兼容性和性能问题,覆盖安卓主流机型。点击:https://wetest.qq.com/product/auto-compatibility-testing 即可体验。**如果使用当中有任何疑问,欢迎联系腾讯WeTest企业QQ:2852350015 ...

November 15, 2018 · 1 min · jiezi

测试工程师的福利!各远程移动测试平台对比分析

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由腾讯移动品质中心TMQ发表于云+社区专栏背景随着移动设备和系统的碎片化程度越来越高以及复杂的移动网络情况, 兼容性测试以及远程真机测试的重要性越来越突出。根据远程测试机/人员与开发者间的合作方式,可以分为以下几种服务:云测试服务、内测服务以及众测服务,相应的平台支持如下图。云测试平台云测试平台提供了远程租用真机的服务,通常是利用自动化框架来实现真机上的脚本自动化运行,或远程租用真机人工测试,或真人真机测试。由于Android端设备的种类众多,云测试服务在Android端应用广泛。国内外都提供了多种云测试平台。1、Pefectohttp://PerfectoMobile.comPefecto将真实移动设备放到cloud端 , 并提供通过web/Eclipse插件的形式进行访问与测试。同时,Pefecto开放了基于selenium的第三方API:MobileDriver,支持自动化测试人员通过Eclipse访问Perfecto上的真机设备,通过MobileDriver远程识别与调用被测应用,快速实现自动化,并与 RQM结合实现对devops的支持。测试脚本可以跨平台(Android/iOS/Blackberry…)执行。2、LessPainful http://lesspainful.com/LessPainful提供了一个多设备平台自动化测试的服务。用户上传应用(.apk)和用Cucumber编写的测试文件,选择测试运行需要的设备配置,最后测试将自动执行并生成测试报告。它支持的设备包括Garmin Asus,几款HTC,LG,Samsung Galaxy,Sony Xperia和Motorola Motodefy。3、TestDroidhttp://testdroid.com/Testdroid是由Bitbar公司推出的手机应用测试的云端服务。TestDroid云端提供了200多种机型,你可以选择你需要的测试机型进行适配测试。 通过Testdriod的测试,还能收集CPU运转以及内存使用情况,从而帮助工程师们提高应用的表现性能,和以防内存被过多占用。此外,用户还可以选择测试机型的语言测试环境,避免由于跨语言导致的潜在漏洞。Testdriod还有一项app爬虫功能,类似于网页爬虫,对你的应用高频次地查看并同时进行图像输出,来模拟真实的浏览过程。TestDroid应用了Robotium /MonkeyRunner生成系列工具,但需要有被测应用的源代码。4、Testinhttp://www.testin.cn/Testin云测试平台是一个基于真实终端设备环境,基于自动化测试技术的7x24云端服务。Testin在云端部署了300多款1000多部测试终端,并开放这些智能终端给全球移动开发者进行测试,开发者只需在Testin平台提交自己的App应用,选择需要测试的网络、机型,便可进行在线的自动化测试,无须人工干预,自动输出含错误、报警等测试日志、UI截图、内存/CPU/启动时间等在内的标准测试报告。支持Android与iOS,业务较为全面。5、百度MTChttp://mtc.baidu.com/MTC是百度云面向移动和web开发者提供的服务,能够满足一般的测试需求,包括当前的热门机型,还支持云端客户端回放。它还提供一个云众测服务,就是开放者上传App,百度提供给用户下载测试,然后将反馈收集返回给开发者。6、腾讯优测http://utest.qq.com/腾讯优测试专业化的移动云测试平台,为广大开发者提供移动应用一站式测试服务与解决方案。提供缺陷分析、应用测试、云手机等主要功能,用户通过平台上传安装包,就可进行全面的兼容性和性能测试,还并可以在线使用多台云端真机,满足更多开发和测试需要。腾讯优测真机实验室目前已配备上千款手机,覆盖市面98%主流机型,724小时在线运行,覆盖亿级用户。构建的数万个适配问题特征库,可以快速准确定位问题。7、阿里MQChttps://mqc.aliyun.com/MQC是阿里移动质量中心推出的真机测试服务的云平台,拥有大量热门机型,提供7x24全天候服务。MQC可以涵盖Android、iOS、YunOS、H5等不同的平台体系,主要服务阿里系和阿里内部如手淘、天猫、聚划算、支付宝等App。8、易测云http://www.yiceyun.com/易测云由国内知名软件公司东软出品,是一个专业为移动APP产品提供适配测试、性能测试、遍历测试、功能测试等多种服务的真机自动化云测试平台,主要为所有移动APP产品的开发者和测试者、以及需要定制化服务的企业级用户,提供安全、专业、高效、易用的自动化云测试服务;强大的录制脚本插件;详细实用的测试报告;以及简单人性化的操作体验。关于云测试平台对比分析的文章已经很多,这里不作赘述。众测平台众测的目的是利用大众的测试能力和测试资源,在短时间内完成大工作量的产品体验,第一时间将体验结果反馈至平台,再由平台管理人员将信息搜集,交给开发人员;同时是从最前端用户拿到的第一手信息,就能从用户角度出发,改善产品质量。1、uTesthttps://www.utest.comuTest是一家来自以色列的创业公司,该公司主要的业务是通过自己构建的一个全球测试员网络为开发人员和技术公司提供软件测试以帮助这些开发人员更好的找到并解决软件中的问题。拥有来自200多个地域国家超过15万专业测试人员。根据测试人员数量的不同,收费也各异,最低499美元,最高可达1999美元。uTest提供了uTest课堂提供了专业软件测试者授权课程的学习使用方法,还提供了工具平台供测试人员提交测试工具或对已有工具评分。总之,uTest给专业测试人员提供了一个社区的氛围。很多大公司都在使用uTest的服务,包括谷歌、微软、Groupon、AOL和BBC等。要想参与uTest测试任务,需要注册并提供详细的测试环境,比如测试机型、测试工作经验、软硬件环境等信息,便于uTest高效分配任务。2、腾讯teslyhttp://tesly.qq.com/腾讯众测是腾讯公司开发的一款基于众包概念的平台。支持应用、游戏、H5混合应用等。多种产品形态,具有Bug探索、产品调研、数据收集和产品评测四种业务模式。3、百度众测http://test.baidu.com.cn/crow…百度众测也是众包模式的典型应用,它将企业产品的相关测试工作交由网络社区大众来完成。百度众测是百度公司开发的众包在软件和产品测试上面的延伸。百度众测“隶属”百度质量部,是一个使广大的互联网用户能够第一时间体验到百度的新产品,从用户体验的角度出发,对百度的新产品提出改进建议,以及各种bug反馈,以便于百度公司及时地改善产品质量。目前,百度众测包括“外部用户测试平台”,“内部员工测试平台”和“开发者平台云众测”。注册用户达到1500万。4、testinhttp://zc.testin.cn/ http://www.mtestin.com/为开发者提供一种完全开箱即用、按需付费的SaaS服务,不仅提供了测试规划、功能测试、兼容性测试、可用性测试、Beta测试等测试服务,开发者还可以直接使用Testin众测平台的Bug管理、用例管理、项目管理、崩溃监控等在线工具,帮助中小开发者无需招聘专业的测试团队也可以轻松将应用质量管理好。5、乌云众测http://ce.wooyun.org/乌云众测是另一种众测类型,是在专业性很强的领域——安全领域深入的一种众测模式,它对众测人员的专业性要求很高,俗称“白帽子”。在乌云众测,企业可在短时间内组建虚拟的安全团队,通过邀请顶尖白帽子模拟黑客对网站、系统或产品进行测试,企业可迅速排查各种安全隐患。同类型的众测公司还有漏洞盒子、Sobug白帽众测,他们是目前国内最大的三家安全众测平台。众测平台总结:众测平台可以分为三种类型, 一种是大众任务型, 主要利用数量来收集数据或模拟特殊情境,如不同网络环境等, 百度众测和腾讯bugly都属于这一类; 第二类是以具有专业知识的测试人员来定向完成任务的模式, 这类的代表是国外的uTest和国内的Testin;第三类是应用于对测试人员专业度要求更高的某类业务——目前主要是安全业务——的模式, 著名的乌云众测、漏洞盒子、Sobug白帽众测就是利用白帽子的“攻”的水平来实现“防”的目的的。内测平台内测平台允许开发者选择合适的测试人员,并允许其与测试人员进行沟通。IOS应用分发多采用这种方式,以苹果收购的TestFlight为代表。这种模式操作起来稍微繁琐,如果是iOS应用的话需要制作特殊的内测版本,获取内测设备的UDID并制作证书,并且有100人的人数限制。1、TestFlighthttps://developer.apple.com/t…TestFlight提供了iOS App测试分发服务,它主要解决的是iOS应用测试分发困难问题,可向指定的人分发应用,双方需要注册TestFlight账号,以及下载TestFlight App,即可在App里测试应用。TestFlight已被苹果收购,因此其UDID证书限制人数可达到1000人。2、HockeyApphttps://www.hockeyapp.netHockeyApp是以TestFlight的替代者的身份出现的,其集成了TestFlight的所有优点,同时增加了自己的一些亮点功能,比如支持更多的平台,服务稳定性也比TestFlight高,并且能够通过SDK方式帮助开发者获取必要的测试信息。HockeyApp被微软收购,是收费应用。 3、Fir.imhttp://fir.im/Fir.im全名Fly It Remotely ,是一个为移动开发者服务,针对应用开发内测阶段,提供应用托管分发,崩溃分析以及反馈收集等一系列帮助开发者提高开发测试效率服务的平台。它提供了开放API,开发者可以将fir.im集成到开发流程中。此外,fir.im还提供了指令工具CLI, 日志查看工具LogGuru、崩溃分析工具BugHD和网速测试等工具。Android端还提供了AndroidStudio插件,方便Android开发者上传应用。4、蒲公英https://www.pgyer.com/蒲公英也提供了面向IOS和Android平台的内测托管和任务分发服务,同样提供开放API。 它提供了移动端SDK用于应用内测数据收集分析、版本更形提示、数据分析统计等多种功能。除此之外,它还提供了专家测试的选项,提供人工遍历测试,IOS审核加速等服务。并且,蒲公英提供了测试管理的平台,使得开发者在单平台上做到收集内测用户问题并得到问题分析。5、Bugly http://bugly.qq.com/Bugly 是腾讯对外开放使用的移动应用崩溃检测服务,同时支持iOS和Android平台。移动开发者在自己的App中接入Bugly的SDK后,就能在应用崩溃后获得信息上报。目前还推出了内测分发服务,但还没有提供收集用户测试结果的方法。内测平台总结:国内的内测平台都还属于起步阶段,更多应用场景在于帮助IOS应用快速发布。远程移动测试平台正在向综合云测、众测、内测甚至远程数据收集工具的方向发展,比如国内领先的Testin平台,在云测、众测攻占城池之后,也推出了内测平台https://pre.im/。蒲公英平台则在内测的基础之上,将bug管理融入平台。读者互动环节你工作中还有用到其他测试平台吗,期待你能给大家分享一下。问答如何并发JUnit测试?相关阅读Android单元测试kafka安装与测试性能测试知识总结 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

October 9, 2018 · 1 min · jiezi