几周前,我完成了RapidFTR开源项目的错误查找 ,这花了我三个晚上。 我认为可能值得分享狩猎的故事。

本文将介绍我的工作。 我将概述我的旅程,以实际找到正在发生的事情的根本原因。 我在本文中的目标是突出显示可以使用的技术示例,以实际跟踪奇怪的和随机的错误。

最后,我找到了一个非常清楚的解释,说明问题发生的原因和原因。 本文标题中存在“随机性”并非巧合。

开始–问题出在哪

问题是,在遵循使用开发虚拟机的指南时,有时启动应用程序会花费很长时间,然后失败。 两次启动应用程序后,我马上遇到了问题。 其他人也有同样的问题。

有人告诉我,没有人真正知道它为什么会以这种方式运行-但是重新启动VM可能会解决它。 它不适合我。

但是我喜欢深入研究问题-所以我想知道出了什么问题。

将档案耙到Solr

运行rake app:run 有时会发生错误。 通过使用--trace --verbose (调试选项)运行rake,我可以看到该应用程序正在等待黑子启动Apache Solr搜索服务。

所以问题是,该过程始终花在哪里? 开始的好处是,rake和sunspot用Ruby编写。 因此,我阅读了代码,并添加了一些输出语句,以查看哪个语句花费了很长时间。 原来,这是Java进程启动了Solr。

挖掘Java

Apache Solr将一些输出发送到sdtout-但黑子将其隐藏在您的面前。 但是由于调试时任何输出都非常有用,因此我想查看输出。

我使用ps -aux查找了ps -aux发出的确切命令行参数,并从命令行手动启动了该过程。 幸运的是,它仍然花费了一些时间-所以我知道问题不在Ruby代码中。

通过端口映射程序nmap,我发现启动该服务需要2秒钟到2分钟以上的时间。 但是耙任务只等待了10秒钟。

现在,有了控制台输出,我可以看到,Solr在内部使用Jetty – 在版本6.1.3中是Jetty ,这花了很多时间– 在这种情况下,它花了时间。 因此,我从源代码管理中下载了6.1.3版的代码,并查看了代码。

我发现了一个名为DEBUG的系统属性,它会增加输出。 我启用了它,并看到最后的调试输出(花了很长时间)与启动会话服务有关(不幸的是,我丢失了指向代码的指针)。

这并没有真正帮助我。 我尝试使Jetty日志与log4j一起工作以最终看到更多内容,但未成功-但我失败了,不得不放弃当晚(第二个)。

调试Java代码

因此,如果您没有从日志中获取任何信息,则仍然可以使用调试器。 但是,代码在VM(Ubuntu盒)上失败了,但在我的本地计算机上却失败了。 但是幸运的是Java有一个远程调试器 。

我使用远程调试参数启动Java进程,并使用SVN中的Jetty代码在IntelliJ中附加了一个侦听器。 我试图使执行在最后一个日志输出附近的断点处停止–但是此方法经常被调用,而我没有在正确的时机到达断点。

但是,当事情花费很长时间时,仅停止正在运行的进程并查看堆栈跟踪可能会有所帮助。 因此,我停止了执行,并从Jetty中搜索了最后一个方法框架,该框架正在调用JDK –在这里,我发现了以下注释:

//This operation may block on some systems with low entropy. See this page
//for workaround suggestions:
//http://docs.codehaus.org/display/JETTY/Connectors+slow+to+startup
Log.debug('Init SecureRandom.');
_random=new SecureRandom();


解决方案

最后–我确实转到了引用的Jetty Wiki页面 。 我发现,Java的java.util.SecureRandom使用来自操作系统的真实熵-当没有可用的熵时,它将阻塞。

仅使用普通的java.util.Random的方法,来自Wiki页面的解决方案将很困难,因为配置文件位于sunspot和Solr内部。 但是行“ NB一些解决方法报告使用/dev/./urandom而不是/ dev / urandom”给了我一个提示,那就是另找。

我用Google搜索解决方案,并在Stack Overflow上发现,可以在Java进程/dev/./urandom /dev/urandom随机替换为/dev/./urandom 。 这可以通过使用命令行参数-Djava.security.egd=file:/dev/./urandom或通过将其替换为文件/usr/lib/jvm/java-6-openjdk/jre/lib/security/java.security (在Ubuntu机器上)。

那怎么了? Java的安全随机数将不接受/dev/urandom作为随机数的源 。 /dev/urandom是无阻塞的,这意味着它将在没有可用的实际熵的情况下返回可以猜测的随机数。 因此,Java默认为/dev/random ,它将阻塞并等待,直到出现熵为止。

这就是为什么在生产或开发机器上极不可能发生阻塞的原因-但是在使用虚拟机时,它确实发生了,因为虚拟机的网络流量和IO并不多。 当您经常重启应用程序时(尤其是在某些情况下无法正常工作时),这种情况通常会发生。

解决方法有点有趣。 Java根据字符串拒绝/dev/urandom 。 它不会拒绝/dev/./urandom ,它当然指向同一个可能不安全的随机数生成器。

最后的话

该修补程序会带来潜在的安全风险–但是在开发虚拟机上,这不是问题。

如您所见,在系统中查找错误或问题涉及使用技术,这些技术使您更接近根本原因。 但是,没有黄金路。 有时,一种技术将无法为您提供更多信息。 因此,您将不得不尝试另一种技术。 有时,您的直觉也会对您有所帮助。

到达这里后,您对这个故事有何看法?

参考:在Johannes Thones博客博客上,我们的JCG合作伙伴 Johannes Thones 狩猎随机的错误-一个真实的故事 。

翻译自: https://www.javacodegeeks.com/2012/10/hunting-random-bug-true-story.html

寻找随机的错误-一个真实的故事相关推荐

  1. js 随机1-10随机数_寻找随机的错误-一个真实的故事

    js 随机1-10随机数 几周前,我完成了RapidFTR开源项目的错误查找 ,这花了我三个晚上. 我认为可能值得分享狩猎的故事. 本文将介绍我的工作. 我将概述我的旅程,以便真正找到正在发生的事情的 ...

  2. “醒事”就在一瞬间 --- 一个真实的故事 (文PPT)

    "醒事"就在一瞬间 --- 一个真实的故事((文&PPT) (说明:这是前一段时间,在科学博客上的博文,朋友说建议吧这篇放在这里) 今天上午,CCF川大学生分会组织了一个师 ...

  3. python随机生成一个日期_Python中随机生成未来一个月内的一个随机的日期时间

    该函数可以产生从当前日期时间开始到未来一个月内的一个固定时间 import random import timeit import time import datetime #该函数随机生成未来一个月 ...

  4. ajax 405报错,使用ajax请求时发生随机HTTP错误405

    我收到HTTP错误405动词不允许.由于有时代码有效,并且有时会抛出http 405错误,所以我需要了解这是编程问题还是服务器配置问题.我用jQuery使用ajax.我在这里浏览了所有相关的帖子,并尝 ...

  5. 编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都向上、向下、向左或向右移动一个元素位置

    编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的"随机步法".程序必须随机地从一个元素"走到"另一个元素,每次都向上.向下.向左或向右移动一个 ...

  6. 算法题:一个圆环上有100个灯泡,灯泡有打开和关闭两种状态,灯泡的状态随机,按一个灯泡的开关,相邻的两个灯泡的状态也发生一次变化。比如暗-亮-暗,按中间灯泡,变化为亮-暗-亮。问设计一道算法,使得所有

    算法题:一个圆环上有100个灯泡,灯泡有打开和关闭两种状态,灯泡的状态随机,按一个灯泡的开关,相邻的两个灯泡的状态也发生一次变化.比如暗-亮-暗,按中间灯泡,变化为亮-暗-亮.问设计一道算法,使得所有 ...

  7. 怎样寻找最佳爱人:一个微积分求解的离散数学问题

    怎样寻找最佳爱人:一个微积分求解的离散数学问题 概率的计算 最好的那个人在位置1的可能性是多少?跟其他任何位置一样,最好的那个人同样可能在位置1.所有的位置都同样可能,所以每一个位置的概率为p= 1/ ...

  8. 爆炸电容器:一个真实的故事从过去的爆炸---凯利讯半导体

    最近在EETimes.com上,Max the Magnificent考虑了被描述为21世纪初期的巨大电容器鼠疫.这促使几个读者评论报告不同层次的经验与最近的电容器问题.然而,印刷电路板上的一些污迹, ...

  9. 对K个不同字符的全排列组成的数组, 面试官从中随机拿走了一个, 剩下的数组作为输入, 请帮忙找出这个被拿走的字符串?

    对K个不同字符的全排列组成的数组, 面试官从中随机拿走了一个, 剩下的数组作为输入, 请帮忙找出这个被拿走的字符串? 比如["ABC", "ACB", &quo ...

最新文章

  1. JavaScript容易犯错的九个陷阱
  2. C语言向文件写入内容并读取显示
  3. [国嵌攻略][084][信号同步编程]
  4. zabbix agent 类型所有key
  5. python的集成开发环境搭建_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...
  6. vs2010调试-尝试调试dll源码。
  7. Spring 事务失效的 8 大场景,看看你都遇到过几个?
  8. 《重磅 | 机器学习特训营,硅谷导师直播授课,现加入仅需68元!》
  9. poj 2485 Highways prim最小生成树 基础 球最小生成树中得最大边
  10. 【转】VMware Fusion Professional 10 序列号
  11. python爬取景点信息_Python用Pyspider爬取TripAdvisor的景点信息
  12. 2015年阿里巴巴1688.com实名供应商数据84万
  13. 在这做一个词云图生成器来送给大家(附代码),建议收藏
  14. hp服务器修改bios做系统,hp 服务器bios设置
  15. 推动服务网格社区前进
  16. 三万元存一年,利息是多少?银行工作人员:这么存最合算!
  17. 八百呼电话录音系统--让通讯管理更安心
  18. CSS(三):CSS特性与盒子模型
  19. 互联网+智慧环保建设需求
  20. “新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛----G-CSL的训练计划

热门文章

  1. cobol host变量_将Host Cobol批次和Monolith Webapps移动到云和微服务
  2. jsap支付_Java命令行界面(第20部分):JSAP
  3. finalizer_Java Finalizer和Java文件输入/输出流
  4. cassandra_Spring Boot Cassandra的第一步
  5. mysql查询会话池_用户会话,数据控件和AM池
  6. javafx属性_JavaFX技巧11:更新只读属性
  7. moxy json介绍_使用MOXy 2.5.1快速且有点脏的JSON模式生成
  8. 使用HTTPS和OAuth 2.0保护服务到服务的Spring微服务
  9. java中重载 参数顺序_Java方法中的参数太多,第4部分:重载
  10. Java中Long到Int的精确转换