导航:首页 > 程序命令 > 程序员问题定位

程序员问题定位

发布时间:2022-08-11 18:01:46

㈠ 如何定位android NDK开发中遇到的错误

如何定位Android NDK开发中遇到的错误

Android NDK中的错误定位对很多开发者来说是一件头疼的事,本文通过一个Demo程序详细讲解了NDK的错误是如何产生的,以及如何通过命令行工具定位NDK的问题所在。

Android NDK是什么?
Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。NDK包括:

从C / C++生成原生代码库所需要的工具和build files;
将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中;
支持所有未来Android平台的一系列原生系统头文件和库。
为何要用到NDK?概括来说主要分为以下几种情况:

代码保护,由于APK的java层代码很容易被反编译,而C/C++库反汇难度较大;
在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的;
便于移植,用C/C++写的库可以方便地在其他的嵌入式平台上再次使用。
Android JNI与NDK的关系
Java Native Interface(JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够与用其它编程语言(如C、C++和汇编语言)编写的应用程序和库进行交互操作。

简单来说,可以认为NDK就是能够方便快捷开发.so文件的工具。JNI的过程比较复杂,生成.so需要大量操作,而NDK的作用则是简化了这个过程。

哪些常见的NDK类型异常会导致程序Crash?
NDK编译生成的.so文件作为程序的一部分,在运行发生异常时同样会造成程序崩溃。不同于Java代码异常造成的程序崩溃,在NDK的异常发生时,程序在Android设备上都会立即退出,即通常所说的闪退,而不会弹出“程序xxx无响应,是否立即关闭”之类的提示框。

NDK是使用C/C++来进行开发的,熟悉C/C++的程序员都知道,指针和内存管理是最重要也是最容易出问题的地方,稍有不慎就会遇到诸如内存无效访问、无效对象、内存泄露、堆栈溢出等常见的问题,最后都是同一个结果:程序崩溃。例如我们常说的空指针错误,就是当一个内存指针被置为空(NULL)之后再次对其进行访问;另外一个经常出现的错误是,在程序的某个位置释放了某个内存空间,而后在程序的其他位置试图访问该内存地址,这就会产生无效地址错误。常见的错误类型如下:

初始化错误;
访问错误;
内存泄露;
参数错误;
堆栈溢出;
类型转换错误;
数字除0错误。
如何发现并解决NDK错误?
利用Android NDK开发本地应用时,几乎所有的程序员都遇到过程序崩溃的问题,但它的崩溃会在logcat中打印一堆看起来类似天书的堆栈信息,让人举足无措。单靠添加一行行的打印信息来定位错误代码做在的行数,无疑是一件令人崩溃的事情。在网上搜索“Android NDK崩溃”,可以搜索到很多文章来介绍如何通过Android提供的工具来查找和定位NDK的错误,但大都晦涩难懂。下面以一个实际的例子来说明,如何通过两种不同的方法,来定位错误的函数名和代码行。

首先,来看看我们在hello-jni程序的代码中做了什么(有关如何创建或导入工程,此处略),下面代码中:在JNI_OnLoad()的函数中,即so加载时,调用willCrash()函数,而在willCrash()函数中, std::string的这种赋值方法会产生一个空指针错误。这样,在hello-jni程序加载时就会闪退。我们记一下这两个行数:在61行调用了willCrash()函数;在69行发生了崩溃。

下面我们来看看发生崩溃(闪退)时系统打印的logcat日志:

如果你看过logcat打印的NDK错误的日志就会知道,我省略了后面很多的内容,很多人看到这么多密密麻麻的日志就已经头晕脑胀了,即使是很多资深的Android开发者,在面对NDK日志时也大都默默地选择了无视。

其实,只要你细心的查看,再配合Google 提供的工具,完全可以快速地准确定位出错的代码位置,这个工作我们称之为“符号化”。需要注意的是,如果要对NDK错误进行符号化的工作,需要保留编译过程中产生的包含符号表的so文件,这些文件一般保存在$PROJECT_PATH/obj/local/目录下。

第一种方法:ndk-stack

这个命令行工具包含在NDK工具的安装目录,和ndk-build及其他常用的一些NDK命令放在一起,比如在我的电脑上,其位置是/android-ndk-r9d/ndk-stack。根据Google官方文档,NDK从r6版本开始提供ndk-stack命令,如果你用的之前的版本,建议还是尽快升级至最新的版本。使用ndk –stack命令也有两种方式

实时分析日志

在运行程序的同时,使用adb获取logcat日志,并通过管道符输出给ndk-stack,同时需要指定包含符号表的so文件位置;如果你的程序包含了多种CPU架构,在这里需求根据错误发生时的手机CPU类型,选择不同的CPU架构目录,如:

当崩溃发生时,会得到如下的信息:

我们重点看一下#03和#04,这两行都是在我们自己生成的libhello-jni.so中的报错信息,因此会发现如下关键信息:

回想一下我们的代码,在JNI_OnLoad()函数中(第61行),我们调用了willCrash()函数;在willCrash()函数中(第69行),我们制造了一个错误。这些信息都被准确无误的提取了出来!是不是非常简单?

先获取日志再分析

这种方法其实和上面的方法没有什么大的区别,仅仅是logcat日志获取的方式不同。可以在程序运行的过程中将logcat日志保存到一个文件,甚至可以在崩溃发生时,快速的将logcat日志保存起来,然后再进行分析,比上面的方法稍微灵活一点,而且日志可以留待以后继续分析。

第二种方法:使用addr2line和objmp命令

这个方法适用于那些不满足于上述ndk-stack的简单用法,而喜欢刨根问底的程序员们,这两个方法可以揭示ndk-stack命令的工作原理是什么,尽管用起来稍微麻烦一点,但可以稍稍满足一下程序员的好奇心。

先简单说一下这两个命令,在绝大部分的linux发行版本中都能找到他们,如果你的操作系统是Linux,而你测试手机使用的是Intel x86系列,那么你使用系统中自带的命令就可以了。然而,如果仅仅是这样,那么绝大多数人要绝望了,因为恰恰大部分开发者使用的是Windows,而手机很有可能是armeabi系列。

在NDK中自带了适用于各个操作系统和CPU架构的工具链,其中就包含了这两个命令,只不过名字稍有变化,你可以在NDK目录的toolchains目录下找到他们。以我的Mac电脑为例,如果我要找的是适用于armeabi架构的工具,那么他们分别为arm-linux-androideabi-addr2line和arm-linux-androideabi-objmp;位置在下面目录中,后续介绍中将省略此位置:

假设你的电脑是Windows系统,CPU架构为mips,那么你要的工具可能包含在一下目录中:

接下来就让我们来看看如何使用这两个工具,下面具体介绍。

找到日志中的关键函数指针

其实很简单,就是找到backtrace信息中,属于我们自己的so文件报错的行。

首先要找到backtrace信息,有的手机会明确打印一行backtrace(比如我们这次使用的手机),那么这一行下面的一系列以“#两位数字 pc”开头的行就是backtrace信息了。有时可能有的手机并不会打印一行backtrace,那么只要找到一段以“#两位数字 pc ”开头的行,就可以了。

其次要找到属于自己的so文件报错的行,这就比较简单了。找到这些行之后,记下这些行中的函数地址。

使用addr2line查找代码位置

执行如下的命令,多个指针地址可以在一个命令中带入,以空格隔开即可

结果如下:

从addr2line的结果就能看到,我们拿到了我们自己的错误代码的调用关系和行数,在hello-jni.cpp的69行和61行(另外两行因为使用的是标准函数,可以忽略掉),结果和ndk-stack是一致的,说明ndk-stack也是通过addr2line来获取代码位置的。

使用objmp获取函数信息

通过addr2line命令,其实我们已经找到了我们代码中出错的位置,已经可以帮助程序员定位问题所在了。但是,这个方法只能获取代码行数,并没有显示函数信息,显得不那么“完美”,对于追求极致的程序员来说,这当然是不够的。下面我们就演示一下怎么来定位函数信息。

首先使用如下命令导出函数表:

在生成的asm文件中查找刚刚我们定位的两个关键指针00004fb4和00004f58:

从这两张图可以清楚的看到(要注意的是,在不同的NDK版本和不同的操作系统中,asm文件的格式不是完全相同,但都大同小异,请大家仔细比对),这两个指针分别属于willCrash()和JNI_OnLoad()函数,再结合刚才addr2line的结果,那么这两个地址分别对应的信息就是:

相当完美,和ndk-stack得到的信息完全一致!

Testin崩溃分析如何帮开发者发现NDK错误
以上提到的方法,只适合在开发测试期间,如果你的应用或游戏已经上线,而用户经常反馈说崩溃、闪退,指望用户帮你收集信息定位问题几乎是不可能的。这个时候,我们就需要用其他的手段来捕获崩溃信息。

目前业界已经有一些公司推出了崩溃信息收集的服务,通过嵌入SDK,在程序发生崩溃时收集堆栈信息,发送到云服务平台,从而帮助开发者定位错误信息。在这方面,国内的Testin和国外的crittercism都可以提供类似服务。

Testin从1.4版本开始支持NDK的崩溃分析,其最新版本已升级到1.7。当程序发生NDK错误时,其内嵌的SDK会收集程序在用户手机上发生崩溃时的堆栈信息(主要就是上面我们通过logcat日志获取到的函数指针)、设备信息、线程信息等,SDK将这些信息上报至Testin云服务平台,在平台进行唯一性的处理、并可以自定义时段进行详尽的统计分析,从多维度展示程序崩溃的信息和严重程度;最新版本还支持用户自定义场景,方便开发者定位问题所在。

从用户手机上报的堆栈信息,Testin为NDK崩溃提供了符号化的功能,只要将我们编译过程中产生的包含符号表的so文件上传,就可以自动将函数指针地址定位到函数名称和代码行数。符号化之后,看起来就和我们前面在本地测试的结果是一样的了,一目了然。而且使用这个功能还有一个好处:这些包含符号表的so文件,在每次开发者编译之后都会改变,很有可能我们发布之后就已经变了,因为开发者会修改程序。在这样的情况下,即使我们拿到了崩溃时的堆栈信息,那也无法再进行符号化了。我们可以将这些文件上传到Testin进行符号化的工作,Testin会为我们保存和管理不同版本的so文件,确保信息不会丢失。

㈡ java程序员如何在部门和团队中给自己定位

一切以你自身的技术和特长来定位.你的问题可能是困惑于将来的发展方向,那么还是要看你在技术方面见长还是你对需求方面的把握比较好.可以走技术路线也可以走需求路线,也就是往技术经理与项目经理发展

㈢ 作为程序员,大家如何给自己定位的

其实作为程序员,用“程序员”和“雇员”这两个词来描述自己是很不充分的。之前听一个入行一年的程序员说起,很多时候,应该把自己看成是一件产品。如果想发展你的职业生涯,你应该把你的职业生涯当作一个产品来开发。提升产品价值的方式有很多:金钱,身份地位,做有兴趣的事情的机会,跟优秀人的共事的机会,等等。都可以增加自己的附加价值。
从这个方向来说:供给和需求
就像一个产品,你也有供和需。你的供给就是你能为雇你的公司提供的东西。它可以是你的能够开发出一个漂亮的网站的能力。它可以是你的能够调配一个数据库的能力。它可以是你的比他人更能出色的完成任务的能力。你的供给是指你将要为雇你的公司提供的实际价值。
你的需求是公司认为的你能为他们做的事。你的需求是你被他人认定的价值。最终你的报酬是跟据你被认定的价值,而不是你能产生的实际价值确定的。这就是为什么这么多10倍优秀的技术人员拿不到10倍工资的原因
— 他们没有被公众认为能够一个顶十个,所以市场力量也不会按这个标准来哄抬他们的价值。
有太多的人喜欢对自己说“只要我能拿出有质量的作品,我就会受到重视。”这是胡说。这种思维逻辑将会成为开发你的潜能的障碍,将会成为得到你理所应得的回报的障碍,将会成为你获得更好身份地位的障碍。你不能只注意到你的供给。供给只是事情的50%。你可以是目前在世的最伟大的程序员,但如果只有一个人知道这个事实,这对你毫无意义。你是个产品,如果你想得到适当的回报,你必须对你的市场需求下功夫。
另外一个方向就是:个人品牌化
能影响你的市场需求的东西叫做“个人品牌”。就是市场宣传。通过它,你可以依靠你的实际价值 — 你的供给 — 来提高你的认定价值 —
你的市场需求。当然这个过程中你的实际价值起很大作用。
个人品牌化本质上是一种公共活动。市场力量的发挥依赖于获得的公共信息。你需要让公众相信你能创造出他们需要的大量的价值。这样你的机会就创造出来了。其中的很多机会会出乎你的意料,让你惊喜。
很多事情都可以扩大你的市场需求。你可以写博客,通过Twitter微博和社会新闻网站做宣传。参与技术会议演讲。通过微博追随者建立社会口碑。参与开源项目,在博客中讲述你在这些项目中都做了什么。我认识的那个一年从业经验的程序员,他会运营自己的博客,有自己的网站,闲暇时光,不断给自己在充电。同时释放自己的价值给公众。
开源项目是一个程序员应该参加的最好的一种活动。它可以向公众展示你解决问题和写程序的能力。你应该强烈的渴求能工作在一个具有开发和捐献开源项目传统的公司里,这样你就可以获得推广自己的好机会了。
推广自己需要付出努力,但有些事情可以从各种活动中容易的获得。开发出一个产品却不做市场宣传是愚蠢的。同样的道理,你需要把自己当作一个产品,像产品一样推广自己。当你做到了这些,你就会看到供需力量相互作用产生的奇妙结果。

㈣ 如何看出一个程序员的技术能力和水平

其实,评论一个程序员技术的高低,不是看他会多少技术,又懂多少技术。参加过什么大型的项目,也不是看他有没有自己的博客,github有多少star。
而是看他解决问题,定位问题的能力。这个很重要,真的很重要。
技术可以很快上手使用,但是解决问题定位问题的能力不是轻易就行的。特别是在高压下解决问题的能力。
下面是师姐为大家整理的一些建议:

解决问题
1.代码的命名要规范。
代码是写给人看的好嘛!代码是写给人看的好嘛!代码是写给人看的好嘛!
headImg是什么鬼?我能以为是banner么,头部的图片,请原谅我蹩脚的中式英语!avatar这个呢、portrait这个呢?会不会更好些?英语不好就不能用好有道、google翻译么?还有用中文拼音命名的,亲,我们用的是英文做为脚本好么?你要用这样的,用易语言可好?!

疯了!
为什么要用框架?一个很重要的原因是命名规范,目录规范,结构规范,分层规范,有利于团队协作,不要本末倒置!
2.架构和规划能力很重要,模块分层,解耦设计什么的,文件目录嵌几层?
这其中又跟命名的能力能搭上点关系。命名都命不好,目录结构怎么建?
url不要做的漂亮些吗?不考虑seo了?
你喜欢addGoods还是喜欢goodsAdd?
请你尊重点我的那些初高中英语语法好么?

3.协助能力、可持续能力。
最好的程序代码是脱离其产生者的。
为自己程序处处救火的程序汪并不是一条好汪。
我记得一句话就是:别想着你的代码以后还有机会重构!
每次说,额,这里我后面会改的,会改的,但是可惜,现实情况是根本不会给你这个时间的。
代码写出来,一是要爽了自己,二是也要爽了别人。

4.debug的能力、总结能力、学习能力真的很重要,代码写出来真的花的时间不长,但擦屁股的时间比写代码的时间多多了!
出了问题不记录,写个博文都好啊,我可没那么强大的记忆力,所以最讨厌考记忆力。
5.不要一贯的使用各种算法,秀算法的你们够了,要写去写底层,应用的场景比较多。
应用层面的程序,算法的应用不是特别多,大部分都是业务代码。以这个作为评价标准的,真心然并卵。

㈤ 程序员的未来发展

社会对程序员的定位是满足技术需求,程序员自身所受的教育和积累的经验也使自主前程意识局限于技术路线。实际上,我们所看到的在技术方面有建树的前辈多是综合型的人才,单纯局限于技术思维的多有行为局限,也难看出自身的幸福感。

毕业几年了,一直都是从事程序员的工作,从以前只管努力学技术,到现在开始慢慢地思考以后的职业规划问题了。

十年三阶段

工程师的职业发展,前十年是个非常重要的阶段。从职业规划的角度来讲,建议把这十年分为三个阶段来设定目标:

第一阶段(前三年):打基础。立足培养技术能力和软技能。第二阶段(四年):从个人能力向团队组织能力转变。在沟通能力、协作能力和领导力上发力。第三阶段(四年):不断强化领导力(技术领导力和管理领导力)。

在我看来,一个工程师的养成可以分为四个阶段:

新人期

硬技能:理论转化实践软素质:养成基本的职业观

成熟期

硬技能:积累业务知识,积累技术知识软素质:固化职业观

发展期

硬技能:明确细化的职业发展方向,深入研究“可能技术, 可能管理, 可能两者兼具”软素质:逐步总结并形成自己的方法论

事业期

硬技能:释放自己,创造价值软素质:输出方法论,影响其他人

看到身边一些“大龄”程序员的出路,主要是这三条:做管理,自己创业和继续写程序。

做管理

做管理是绝大多数人的选择。原因嘛,当下中国职场的大环境如此:招聘单位一般不要年龄大的程序员,再加上你年龄大些后,实战经验丰富,不让你带人让谁去带呢?“大龄”程序员有着多年的开发项目经验,这些实战经验能一些岗位起到很重要的作用。比如:CTO,项目经理、产品经理。

相信在多年的工作中你的技术是无话可说的,但是管理的方式、为人处事的方法、稍稳妥的工作作风以及对于企业长远的眼光可能是你们真正需要加强的。

创业

自己创业的,这种人大多数是在工作中到了一定的岗位,有了一定的资本,综合能力提升到一定的水平,但跟搞管理一样,你还缺许多技术之外的东西

创业者要做的产品不是给客户的商品,而是企业本身。把企业看做一个系统,运转良好的系统,就是创业者要开发的产品,这个理念,对于运作企业是非常重要的,也从根本上回答了如何做好企业的问题。

如果单纯是因为自己工作不开心,对老板不满而愤然离职创业的,这种基本成功概率为零。

如果想继续抱着键盘安安静静地写程序,估计要在某个技术方向深度学习。比如做游戏就一直做游戏,做网络就一直做网络,其它方向的工作基本不在考虑范围内,这样才能在一个方向上积累下来;否则各个领域都会一点皮毛,但又没有精通的,企业几乎不需要这种人。

程序员找出路还是要尽量提前进行职业规划和准备,千万不要说什么:“走一步,算一步”的话。在这个一睁眼就是竞争的时代,你可以放松休息,但别人会继续前进,不会等你。

㈥ 一个菜鸟程序员该怎样定位自身的价值方向

我到底能够解决什么问题?给别人带来什么样的方便?这是每个程序员首先要考虑的问题。这决定了你要在什么样的领域、什么样的公司工作,决定了你做什么产品,也决定了你要选择什么技术。

㈦ 程序员不同级别的定位

哦,看来落后了,早都改了,分别叫程序员,软件设计师,后面一个忘记了,好象是分析员什么的了..。..
分别用来衡量你对软件设计的一种能力了....
如果可以对立开发软件的话,就基本上达到了程序员的级别,也就是以前的初级程序员了。..
而软件设计师呢,它主要是对软件开发的一种总体规划了...建议你多看看软件工程.如果你仔细看完软件工程,应该可以达到这个级别了..
而到最高境界的话,就必须能够对软件的设计提出详细的模块化的分割.
然后分割后交给程序员去完成的了....
所以我说你应该是基本上达到了程序员的级别了。.

㈧ 程序员需要具备哪些知识

1、程序员需要学会主动学习,要懂得懂得不断精进自己的专业技能。
2、程序员需要具有个人品牌意识,要学会自我营销,在业界打造自己的个人品牌。
3、程序员重视单元测试,专业的程序员需要知道单元测试的重要性,会把测试代码和产品代码看的一样重要。
4、程序员要善于管理时间。尊重对方的时间。只召集那些必要的同事参加会议,并且会在会议前整理好会议的主题和议程。
5、程序员要善于管理精力。专业的程序员能够让自己精力充沛地投入到工作中。
6、程序员要善于管理压力。专业的程序员会尽量避免压力,他们谨慎承诺,不答应做不到的事情;懂得保持代码的整洁,方便问题定位和重构代码。
7、要懂得去掌握一些编程之外的技术。专业的程序员除了们具备计算机原理、TCP/IP协议这些计算机学科的基础知识,他们也会对常用的Shell命令牢记于心,他们还善于使用各种工具的快捷键来提升他们的工作效率。

㈨ 我是web前端程序员,经常遇到火狐下的定位问题,特别是在table表格的时候,具体情况如图。

您好!感谢您对火狐产品的支持!如果您的电脑上面有多款浏览器,当您打开火狐浏览器,界面上就会有个提示,是否设置为默认浏览器,点击“是”就可以了。火狐浏览器使用的是Gecko内核,是一款开源、安全的浏览器,拥有非常强大的扩展功能,可以根据自己的需求定制浏览体验。您可以在火狐社区了解更多内容。希望我的回答对您有所帮助和得到您的采纳。

㈩ 程序员日常生活面临的问题和挑战有哪些

一、熬夜
很多程序员将熬夜变成了生活习惯,还口口声声解释“程序员只有在晚上效率才高”,这是非常扯淡的理论。有人将程序员做下图的类比,虽然比较贴切,但这种方式对你的健康伤害是最大的。建议你尝试一下晚上10点睡觉,早上6点起来工作的作息方式,也许会事半功倍。
二、久坐
有些程序员在电脑面前一坐就是一天,中间除了吃饭上厕所外,基本不起来动动。这是非常不好的习惯,时间久了,很容易得肩周炎、颈椎病,到时候后悔就晚了。建议每坐一个小时就起来动10分钟,主要是转转手臂和脖子。
三、外卖和泡面

很多程序员在饮食上也非常不注重健康,上班的时候为了贪图方便经常叫一些外卖,更厉害的是直接搞一桶方便面来做午餐。这里建议大家中午出去吃,荤素搭配,再可以弄点水果。
四、缺乏锻炼

建议在工作日下班后做一些简单的球类运动,乒乓球、羽毛球。
五、用眼过度
IT公司的员工的体检报告中大部分程序员都患有“慢性结膜炎”,当然对于这个病并不是长时间对着电脑引起的,但是用眼过度也会加剧“慢性结膜炎”的恶化。
建议大家平时准备防止眼干的眼药水,如果确定是结膜炎的话,还要及时去医院就诊。另外电脑的背景可以设成绿色,这样对眼睛也能起到一定的保护作用。

阅读全文

与程序员问题定位相关的资料

热点内容
mac安装不了python库 浏览:257
现代父子训诫墨唯瑾 浏览:290
linux应用防火墙 浏览:500
百度云服务器白嫖 浏览:270
韩国同志电影肉多的有哪些 浏览:643
床戏很厉害的电影 浏览:893
苏州追觅科技程序员 浏览:919
程序员我最多等你两天 浏览:175
梁家辉电影在线观看 浏览:277
好看的电影地址 浏览:838
福州爱琴海电影院 浏览:626
男主角是白头发的日本电影 浏览:967
androidhtml滚动条 浏览:679
在线电影网站推荐 知乎 浏览:383
python多长时间能学习 浏览:884
java正则图片 浏览:601
怎么对u盘的文件夹加密 浏览:320
手机为什么自动卸载app 浏览:51
只有一个程序员的公司 浏览:27
php敏感词检测工具 浏览:607