记一次调试

这是我最近几个月来遇到的最棘手的一个问题:
* 昨天花了4个小时找出第一层次的原因
这个纠结啊,本来和老婆说好准时下班回家吃饭的,结果被这个问题拖了老久。

这是一个gradle的plugin,用来resolve公司内部的dependency的,弄完了跑测试项目的,抛一个NPE,而且NPE还不在自己的代码里面。好吧,把gradle的源代码翻出来看,如果是自己传进去的一个值是null,解决起来也还ok了。结果到里面一看,那是一个loop里面,迭代map的时候出的错 - 可以算是NPE中的最坏情况了把。仔细查看一下代码,好吧,是迭代环境变量的。那行,在自己的代码里把环境变量都打出来谁是null吧。结果全ok,看来是顺序问题,在我打出来的时候,那个null的还是设上呢。既然是环境变量被设,那就在自己的代码里搜搜看有没有可疑点吧,还真找到个地方,一print还是真是在那个地方把PATH设成了null。

照理犯罪现场找到了,解决也就三下两下的事了,于是我打算解决完,发完code review再走。结果发现那个null是被这么设上的:
env_path = plugin_ext.getCompileTimeJNI(jniPaths)

这是groovy语言,plugin_ext是一个gradle的plugin的extension,getCompileTimeJNI是定义在extension中的一个closure,我死活检查getCompileTimeJNI,他也绝对不可能返回null,如果有exception的话,也应该抛出来,而不是返回null。

仔细检查代码,理清逻辑,打印结果,还是毫无头绪,无奈已经7:30多了,还是先回去吧。

* 今天早上大概也两个小时吧,找出的根本原因
周六早上起来, 多少还惦记着这件事,再看看吧。
终于,在观察打印出来的结果时,我注意到一个细节:在打印plugin_ext.getCompileTimeJNI的时候:
第一次是closure的地址
然后调用closure:plugin_ext.getCompileTimeJNI(jniPaths)
第二次就是一个Set了

这说明这个closure的调用有点蹊跷,我已经检查过了closure的实现本身没有问题,那么问题就在这简简单单的一句closure的调用上。 这花了我很长的时间去发现并相信着其实不是一个函数调用,而是一个赋值:
plugin_ext.getCompileTimeJNI(jniPaths)
就是
plugin_ext.getCompileTimeJNI = jniPaths
我不知道为什么gradle要发明这么坑爹的语法 - 这绝对是编码质量与效率的杀手,但是不管怎样,根源问题是找到了:
env_path = plugin_ext.getCompileTimeJNI(jniPaths)
这个赋值语句永远返回null

* 暂时有了一个workaround,还没有比较official的解决方案(if there is one)
你当然可以plugin_ext.getCompileTimeJNI,call,这是这改变了原有api的调用方式,是个breaking change,而且巨丑无比。

我觉得这是设计有点问题,也在咨询gradle官方:http://forums.gradle.org/gradle/topics/call_plugin_extension_property_becomes_an_assignment

目前的workaround,还是基于gradle对extension的奇葩设计:
* 如果你的closure是定义在extension里面的,调用即赋值,挂
* 如果你的closure没在extension定义中,而是在后面使用时加上去的,调用还是调用,ok
所有workaround就是把getCompileTimeJNI移出extension的定义,在外面加。

记一次调试

时间: 2024-10-13 12:59:19

记一次调试的相关文章

Chrome调试折腾记_(1)调试控制中心快捷键详解!!!

转载:http://blog.csdn.net/crper/article/details/48098625 大多浏览器的调试功能的启用快捷键都一致-按下F12;还是熟悉的味道;  或者直接 Ctrl> + Shift + J: 直接进入console面板 点击第一张截图圈圈那个进入,看到Shortcuts这个就是了-.快捷键大全 快捷键大全 快捷键有这么以下几大类..且看我一一道来~~~注:All pane是全局快捷键 Console() Ctrl + L : 清除控制台消息 Tab : 自动

[软件测试_hw1]记一次调试bug的经历

上学期期末web开发的大作业,要求写一个通缉犯管理系统,基本要实现的功能归结起来不外乎数据库的增删改查.大体实现起来很容易,但在一些细节上让我纠结了很久.其中一个就是中文乱码的问题.其中主要涉及一下两个方面: 一.无法在mysql数据库中插入中文的数据,一旦涉及中文数据,在数据库中就会变成乱码.经过查询发现是由于数据库的默认编码设置的问题,将相应表和列的编码设置成UTF-8即可 二.页面显示乱码. 1.通过<%@ page language="java" import="

记一次调试python内存泄露的问题

转载:http://www.jianshu.com/p/2d06a1a01cc3 这两天由于公司需要, 自己编写了一个用于接收dicom文件(医学图像文件)的server. 经过各种coding-debuging-coding-debuging之后, 终于上线了, 上线后心里美滋滋的, 一切正常. 第二天一上班, 负责人和我说接收太慢了, 卡的要死. 我想难道是python本身的问题?(程序员本征思维)我好奇的打开了终端输入 ps -aux | grep python 找到进程id 即 2161

vs2012编译的程序不能在XP和2003下执行问题的解决方法

问题如题,通过无数次百度和谷歌后,发现,微软已经确认这是一个缺陷,安装Vs2012的update 3的升级包就可以解决问题.同时,在分发包的地方,vcredist_x86.exe 随程序分发一份就可以了. 同时记着把调试模式下的dll带上,debug模式下的dll为 msvcr110d,这样软件就可以在2003和xp下面尽情的run了!vs2012的硬伤从此修复. vs2012的升级安装包在线安装程序为:VS2012.3 ——————————————————- 当然了,也可以将msvcrt的库静

mac下android环境搭建笔记(android studio)

http://www.tuicool.com/articles/FNRfyiF 本文记录了本人在mac上配置android开发环境的一些过程,为了方便直接选用了官方的IDE– Android Studio .本文包括了android studio的安装.创建第一个hello world项目以及真机调试. 首先下载android studio 下载地址: http://developer.android.com/sdk/index.html 建议提前修改下hosts,要不稍后下载sdk特别慢 su

大学毕业访谈

先前收到通知,需要接受一次毕业访谈,内容做成微信推送,并且会挂在学院网站上. 既然有了这个机会,我就想把大学四年的感想用文字永远被保留下来,于是写了一篇文章,里面包含了我真实的想法,每一点背后都是有真实的事情发生在我头上的. 目前微信推送已被封杀. 再次声明,本文仅为个人观点.在我自己的博客里抒发一下真实感想,总不会有问题吧? 以下为原文: 算法爱好者周甄陶:只与同好赏风雅 本期人物 周甄陶 人物简介 ACM算法竞赛爱好者 获得国内外多家企业算法工程师的offer(今日头条.微软.京东……) 曾

记一次在linux 平台上的优化调试

Author:DriverMonkey Mail:[email protected] Phone:13410905075 QQ:196568501 测试平台:AM335X 优化前状态:采样速度  105次/S 优化目标:速度为 130次/S 以上(注:根据ADC的采样率理论上可以达到 330次/S) 优化步骤: 1)代码框架可分为四大模块(UI, 业务逻辑管理,设备管理,远程管理)共10个线程 模块间有项目依赖关系,不能一下全部停掉,先去掉一些辅助功能线程(如:按键扫描线程,远程命令处理线程等)

记一次内存泄露调试(memory leak)-Driver Monkey

Author:DriverMonkey Mail:[email protected] Phone:13410905075 QQ:196568501 硬件环境:AM335X 软件环境:linux 3.2 现象:1)系统运行一晚上,配置硬件操作失效 2)系统放置在那,没有用户输入会自己死机 调试过程: 第一步:分析硬件配置失效原因,怀疑配置硬件代码有问题 最后发现 代码 调用 system() 函数配置硬件没有调用成功 返回值 为 -1. 第二步: 继续上一步 分析 system() 在什么情况下会

烦躁而无奈的一次调试-记fpga驱动ad9854

写这篇东西,主要还是要发泄心中之不爽,毕竟debug不出来很影响食欲和心情,也没心情陪妹纸了. 一个月前,师兄便开始带我fpga,先让我驱动个dds作为训练.由于暑假的原因,就停停放放的,在家先把VHDL简单过了一遍,又反复研究了一下AD9854的datasheet.什么寄存器啊,时序啊都了解的差不多了.一个星期前开始着手编. 但是菜鸟不会重头编啊,所以先拿了一个网上的驱动程序,根据板子的实际电路对程序作了修改.感觉不是很难吧,但示波器木有一丁点现象啊,芯片却在发热.然后我就开始一点一点的改啊,