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

js 随机1-10随机数

几周前,我完成了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中附加了一个侦听器。 我试图使执行在最后一个日志输出附近的断点处停止,但是这种方法经常被调用,而我没有在正确的时机到达断点。

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

//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

js 随机1-10随机数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用python写九九乘法口诀表左上角_python打出九九乘法口诀表

用IDLE打出乘法口诀表,想要就是如下图的结果:实现算法很简单,但是IDLE(python3.7)默认的换行输出方式不太容易实现,得需费一番脑筋。代码如下:*row0 #设置行数,值为1时候…

设计模式(一)Chain Of Responsibility责任链模式

设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser {String msg;public MsgProcesser(String ms…

如果你是IT技术人员,请思考这15个问题

行内的人自嘲是程序猿、屌丝和码农,行外的人也经常拿IT人调侃,那么究竟是IT人没有价值,还是没有仔细思考过自身的价值? 1.搞IT的是屌丝、码农、程序猿? 人们提到IT人的时候,总会想到他们呆板、不解风情&…

在Windows上运行-XX:CompileCommand

HotSpot JVM提供了几个与即时 ( JIT )编译有关的命令行参数。 在本文中,我介绍了开始应用命令行标志-XX:CompileCommand所需的步骤,以查看对单个方法执行的即时编译。 JIT概述 Nikita Salnikov-Tarnovski的博客文章您…

匹配中文字符的正则表达式: [u4e00-u9fa5](

匹配双字节字符(包括汉字在内):[^x00-xff]评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:ns*r评注:可以用来删除空白行匹配HTML标记的正则表达式&…

python define function的顺序_Python怎么根据一个函数来决定列表顺序

def__init__(self,function):self._queue[]self.functionfunction然后要写一往列表里增加元素的方法,按照function排序,function类型为函数defadd(self,item):"""AddtothisP...def __init__(self,function):self._queue []self.function…

excel单元格内容合并

这几天在整理数据,有时候数据都在表格的不同单元格中,想把两格内容合并为一格,于是验证了两种方法方法一:(1)在B1输入公式A1&B1(2)做完第一步后,选中B1后,鼠标移到单元格右下出现“”符号是下拉,就能得到结果,如图:方法二(1)在B1输入公式…

主分区与逻辑分区的区别

硬盘分区有三种,主磁盘分区、扩展磁盘分区、逻辑分区。 一个硬盘可以有一个主分区,一个扩展分区,也可以有一个主分区和若干逻辑分区。(图1为大家最常见硬盘分区类型) 主分区 主分区是硬盘的启动分区&#xff0c…

wxpython图形编程_wxpython  图像编程

1)目前遇到一个问题,就是wxpython显示一个图片,然后可以在图片上画矩形,点,line,circle and soon,最后保存矩形的坐标.但是现在可以在屏幕上画矩形,无法在图片上做标记,我反思的原因…

如何利用火狐获取网址中的提交链接

1、添加firebugz组件 2、用火狐打开你要的获取链接的网址例如 http://www.dce.com.cn/dalianshangpin/xqsj/tjsj26/jdtj/jdcjpm/index.html 3、按F12 4、点击你查询的按钮如点击如图下中的年月然后在firebug上点击网络获取里面的post链接 5、点击HTML 中的一个post &#xf…

python-22 eval json pickle shelve 之间差别

1.eval:可以转化字符串,字典,元组,列表等一般类型,不能转化类,函数 2.json:可以转化一般类型外,还可转化函数,可以在任何语言间转化,转化为字符串,可以写入文本&#xff…

打破冷漠僵局文章_研究僵局–第1部分

打破冷漠僵局文章我敢肯定我们都去过那里:太晚了,您饿了,您的服务器已挂起,或者您的应用程序正在以蜗牛的速度运行,并且有人喘着粗气想要您解决问题,然后再去解决。 您的应用程序意外挂起的可能原因之一是称…

vs2008下设置.h, .lib和 .dll 的路径配置全图及其意义

文件夹: 类型文件 include: .h (头文件) lib: .lib (库) 前面二者在vs2008中通过属性来配置。 bin: .dll (动态链接库) 动态链接库是通过系统路径来配置的。 添加库(libs)文件目录 …

按键精灵调用迅雷下载文件

Set ThunderAgent CreateObject("ThunderAgent.Agent") 建立迅雷接口对象ThunderAgent.AddTask "http://10.10.10.10/电影世界/12新电影/随风而逝.rmvb", "随风而逝.rmvb", "", "", "", - 1 , 0, - 1 Ca…

POJ1821 Fence

传送门 这道题是一道很好的单调队列优化DP的例子。 题目大意是有n个工人,每个人可以粉刷一段长度不超过l[i]的墙,如果一个人粉刷了那么他必须要粉刷第s[i]块墙,一个人粉刷一块墙能得到p[i]的钱,求所有工人得到的钱的最大值。 我们…

使用Spring Security和jdbc的Spring Boot

Spring安全性是一个很棒的框架,可节省开发人员的大量时间和精力。 此外,它还具有足够的灵活性,可以自定义并满足您的需求。 使用JDBC和Spring Security非常容易,并且许多操作是自动化的。 这将是一个最小的展示。 gradle文件包含…

map 循环_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解

不知道最近有没有被一道Java面试题刷爆朋友圈,Spring框架的循环依赖如何解决。我收到了不少粉丝的提问,在了解到之后,也去网上查询了一些资料,自己也询问了身边的同事,总结出以下几个方面,今天就和我来看一…

调用ThunderAgent 迅雷局域网版的开发

P2P方式的下载,为我们获取互联网资料提供了一个强有力的工具,它可以争取最大的带宽,获取最大的下载速度。最早采用P2P方式下载的工具有BT、电骡等,后来许多传统“多线程断点续传类”软件,也增加了对的支持,…

详解虚拟机中为Linux添加硬盘

Linux添加硬盘是在原来安装的硬盘空间不够或者需要使用其他硬盘上的东西时候的解决办法,因为大多数初学者习惯使用虚拟机,这里以在Vmware虚拟机中实现Linux添加硬盘的具体步骤来详细介绍说这个问题。 Vmware中为linux增加硬盘 1. 在vmware的setting中为虚…

vue 常用功能和命令

1. vue-cli 构建项目 # 全局安装 vue-cli $ npm install --global vue-clif # 创建一个基于 webpack 模板的新项目 $ vue init webpack your-project-name # 安装依赖 $ npm install # 进入项目 $ cd your-project-name # 开发版本打包并运行 $ npm run dev# 线上环境整个项目打…