首页 文章 精选 留言 我的

精选列表

搜索[功能异常],共10007篇文章
优秀的个人博客,低调大师

Android TextView 中 setText 的空指针异常

第一次发现这问题,记录一下,在适配器里面给TextView设置一个int类型的值,然后闪退报错,DeBug模式下查看了布局和id,均没有问题,再次查看日志输出,Caused By: android.content.res.Resources$NotFoundException:String resource ID #0x86,发现有两个词引起了注意String Resources,才知道TextView在内部实现时设置的类型为String,所以用String.valueOf(),这里再啰嗦几句,在String类型的转化问题上,String.valueOf()效率最高,因为虚拟机对它进行了特殊处理,其次是toString,最后是+""的拼接形式,拼接String的形式内部实现其实就是toString,但是要相对复杂一些,拼接过程中产生了常量和一些判断条件,效率低下,详情见源码

优秀的个人博客,低调大师

调试模式 file.exits判断目录异常

代码如下: public class testfile { public native RenderCar(); public native RenderSky(); public boolean testPathExit() { String str = Environment.getExternalStorageDirectory().getPath(); str = str + "/Android/data/test/"; String str1 = "/storage/sdcard0/Android/data/test/"; File file = new File(str); if (file.exists()) { return true; } return false; } public String getDataPath() { String str1 = "/storage/sdcard0/Android/data/test/"; String str = Environment.getExternalStorageDirectory().getPath(); str = str + "/Android/data/test/"; File file = new File(str); if (file.exists()) { return str; } return str1; } } 说明:该类编写了一些native函数,调用Jni实际的函数实现,在调试模式下getDataPath函数测试出来的str目录永远是不存在的,因为直接return str1,但是testPathExit函数测试的结果却都是true,说明该目录存在,并且单步调试过程中进入到断点ret = true. 在发布版本中,打印getDataPath返回的字符串,目录确实是存在的,返回结果是/storage/emulate/0/Android/data/test,说明确实返回return str,目前尚未有任何合理的解释 本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1596723,如需转载请自行联系原作者

优秀的个人博客,低调大师

native程序异常crash 定位解决方案

Android程序崩溃退出的时候,会将崩溃的堆栈信息保存在/data/tombstones目录下。 该目录需要ROOT权限才能够访问。所以为了访问该路径,手机必须先ROOT破解。jni或者java 代码崩溃的信息都被记录。该目录下会有九个tombstones_0(1-9),生成的崩溃信息会循环写入 该文件中,测试之前可以讲所有的文件删除,就可以得到唯一的一个崩溃日志。生成的文件 记录了详细的堆栈信息。 为了拷贝到电脑上,需要通过adb shell进入手机终端,然后su,获取root权限,接着 拷贝文件到sdcard上,退出adb shell,之后,通过adb pull /sdcard/tombstone_00 E: 拷贝到E盘 该文件详细记录了代码崩溃时候的具体信息,包括了崩溃的堆栈,如果能够获取到该信息,就可以通知堆栈了解崩溃点的信息,但是一般情况下,我们看不到该文件。 当我们发现/data目录为空的情况下,实际上表示我们没有root访问权限,(root是最高级的访问权限,而不是启动的时候的访问文件的权限,这个权限需要对android手机进行权限进行破解) 注意 查看tombstons文件,发现很多情况下,没有提供源码错误的函数名称和源码的错误行号,可以通过ndk-stack.exe 程序对崩溃日志再次定位 $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump tombstons 例子 D:\Development\Android\android-ndk-r10b\ndk-stack.exe–sym armeabi-v7a –dump E:\docs\tombston_01 > E:/detail.txt 附录: 不同的手机遇到空指针的时候,处理的方式是不一样的,小米手机直接闪退,而华为平板依然能够直接运行,跳过崩溃的错误,说明测试多种机型的重要性。 参考 http://cmzx3444.iteye.com/blog/1463035 本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1408644,如需转载请自行联系原作者

优秀的个人博客,低调大师

Linux上性能异常定位以及性能监控

引言:大多数的服务都是跑在Linux上的,Linux现在也已经到了一个很广泛的应用,但是仍然会有很多问题出现,我们就来讨论下我们性能监控的指标,性能监控无非就是从I/O,内存,CPU,TCP连接数,网络,进程或者线程来出发,使用到的命令有iostat,vmstat,sar,mpstat,netstat,ss,iftop,free,pstree/ps,pidstat,top,(uptime)下面来进一步深入下吧. 一,磁盘I/O(iostat) 我们的机器上有很多的数据是存储在磁盘上的,我们读取的很多数据都是要和磁盘交互的,但是磁盘同时又是一个低速设备,很多时候会发生阻塞,所以磁盘I/O的监控很重要。我们使用iostat来诊断磁盘的情况。使用的机器是腾讯云主机。 tps:该设备每秒的传输次数,表示每秒多少个I/O请求 Blk_read/s:每秒从设备读取到的数据量 Blk_wrtn/s:每秒向设备写入的数据量 Blk_read:读取的总数据量 Blk_wrtn:写入的总数据量 %user:代表用户态进程使用CPU的负载 %nice:代表优先级进程使用的CPU负载 %system:代表内核态进程使用的CPU负载 %iowait:代表CPU等待I/O时,CPU的负载 %steal:代表被偷走的CPU负载情况,这个在虚拟化技术中会用到 %idle:代表空闲的所占用的CPU负载情况 iostat还有一个常用的参数选项-x,表示扩展的信息 rrqm/s:每秒这个设备相关的读取请求有多少被Merge(多个I/O合并的操作)了 wrqm/s:每秒这个设备相关的写入请求有多少被Merge了 r/s:每秒发送到设备的读请求数 w/s:每秒发送到设备的写请求数 rsec/s:每秒读取设备扇区的次数 wsec/s:每秒写入设备扇区的次数 avgrq-sz:平均请求扇区的大小 avgqu-sz:平均请求队列的长度 await:每一个I/O请求的处理的平均时间(等待时间) r_await:每一个读I/O请求的处理的平均时间 w_await:每一个写I/O请求的处理的平均时间 svctm:表示平均每次I/O操作的服务时间。如果svctm值和await值很接近,则表示I/O几乎没有等待,如果await的值远高于svctm的值,则表示I/O队列等待太长 %util:在统计的时间内总共有多少的时间用于处理I/O操作,即被消耗的CPU的百分比。例如统计时间间隔是1s,那么这个设备有0.65s在处理I/O,有0.35s处于空闲。那么这个设备的%util=0.65/1=65%,一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈) 二,内存(free) 在Linux系统中我们查看内存使用情况。使用free命令来查看 第一行的信息(我们可以认为从操作系统层面看待) total:总物理内存大小 used:已经分配的大小 free:没有被分配的大小 shared:共享内存的大小,主要用于IPC通信 buffers:用于块设备的缓冲 cached:用于文件内容缓冲,也就是缓存 "缓存"就是在内存中划分一块区域,作为进程和硬盘之间的缓冲区,进程将数据写入缓存中,当那些数据需要读取的时候,就直接去"高速路"缓存中读取,而不会去"土路"硬盘中读取,这样大大的加快性能 这里buffer实际上是存储了我们数据的元数据(包括目录名字,文件大小,文件存储块,修改时间,权限等),而cache则存放了我们最近读取过的文件。 第三行信息(我们可以认为从应用程序层面看待) 这里的-/+ buffers/cache分别为 -buffers/cache 和 +buffers/cache 两部分 -buffers/cache = used(第一行)-buffers-cached 实际上是当前程序上"真实使用"的"物理内存" +buffers/cache = buffers+cached 意思就是暂时"借给"系统作为"缓冲区"使用的内存大小 used=(+buffers/cached)+(-buffers/cached) 所以从应用程序层面看,可用内存=free memory+buffers+cached 详细信息我们可以通过下面这种方式查看. ~ cat /proc/meminfo MemTotal: 1020128 kB MemFree: 670772 kB Buffers: 97780 kB Cached: 100980 kB SwapCached: 0 kB Active: 164988 kB Inactive: 117296 kB Active(anon): 83536 kB Inactive(anon): 160 kB Active(file): 81452 kB Inactive(file): 117136 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 92 kB Writeback: 0 kB AnonPages: 83504 kB Mapped: 17500 kB Shmem: 172 kB Slab: 46696 kB SReclaimable: 28652 kB SUnreclaim: 18044 kB KernelStack: 1744 kB PageTables: 2636 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 510064 kB Committed_AS: 343800 kB VmallocTotal: 34359738367 kB VmallocUsed: 7112 kB VmallocChunk: 34359727304 kB HardwareCorrupted: 0 kB AnonHugePages: 36864 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 8184 kB DirectMap2M: 1040384 kB 三,CPU(dstat,mpstat) 首先我们使用dstat命令来查看下我们的CPU情况,他能够实时的输出我们的信息, 每2秒输出一次,一共输出10次 cpu:hiq、siq分别为硬中断和软中断次数 system:int、csw分别为系统的中断次数(interrupt)和上下文切换次数(contextswitch)。 -c:表示只显示我们的CPU信息 -m:表示只显示我们的内存信息 -p:表示只显示我们的进程信息 -n:表示只显示我们的网络信息 我们想以什么为什么优先顺序查看,可以在后面加下列参数 mpstat %user 在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程 (usr/total)*100%nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100%sys 在internal时间段里,内核时间(%) (system/total)*100%iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100%irq 在internal时间段里,硬中断时间(%) (irq/total)*100%soft 在internal时间段里,软中断时间(%) (softirq/total)*100%idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100 四,TCP连接数(ss,netstat) ss是Socket Statistics的缩写,顾名思义ss命令就是用来获取sockets的信息,他可以显示和netstat类似的内容,但是他比netstat更快更高效,而且显示更为详细的有关TCP连接信息。当我们的sockets连接数非常大的时候,无论是我们使用netstat命令还是在内核中查看连接数cat /proc/net/tcp的时候都会很缓慢。 ss快速的原因就是他利用了TCP协议中的tcp_diag,tcp_diag是一个用于分析和统计的模块,他可以获取到Linux内核中的第一手信息,这个就确保了ss的高效性。 我们可以对netstat和ss做个对比,有图有真相嘛 netstat命令的时间显然比ss命令的时间慢多了 netstat命令 我们可以看到系统中守护进程的连接状态信息以及监听到的端口号 -t:表示TCP的连接 -u:表示UDP的连接 -n:表示以数字的形式显示信息 -p:表示显示监听的端口号 查看系统中守护进程的监听状态 我们可以看到State状态显示 ss命令 查看当前服务器的网络连接统计: ss -s 其他ss的用法和netstat用法相同 五,网络(iftop) 使用iftop -i eth0 使用Ctrl+c退出,退出显示 我们可以使用-i参数监听不同的网卡流量信息,在iftop的哪个界面我们可以使用按p来查看端口流量信息 六,进程信息(ps/pstree,top,pidstat) 我们使用pstree来查看下我们的进程树,所有的进程都是init进程的子进程 ps命令 查看具体的进程,比如MySQL进程我们可以使用ps aux mysqld或者ps -elf mysqld这种方式,这两种本质上没有什么区别,因为Linux继承的是Unix的一些思想,一个是Unix的Sys-v风格,一个是BSD的风格 我们可以详细的看到他的信息 pidstat命令 我们可以使用pidstat来查看每一个进程的pid的状态信息,以及他所占的CPU信息 六,综合显示(vmstat,top,sar) 我们看到内存,交换分区,I/O,CPU,以及进程上下文切换次数 top命令 在这个界面下: 按m按照内存使用大小排序显示 按P按照CPU使用大小排序显示 按M按照常驻留内存大小排序 按k表示杀死某个进程 sar命令 有时候我们可能需要统计下我们的Linux启动了多长时间,我们可以使用uptime命令来显示这个信息,top也可以显示 uptime命令 top命令显示

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册