尋找隨機的錯誤-一個真實的故事

幾周前,我完成了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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371318.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鈴木uy125摩托車機油_UY125 新瑞夢UM125發布 濟南鈴木于湖南株洲吹響國IV集結號...

?4月18日,濟南鈴木在湖南株洲天臺開元酒店舉行了2019年新品發布會,并于現場發布了兩款極具終端戰略意義的新款國IV車型,分別為定位“實用運動”的全新個性化踏板車型UY125,以及能夠進一步鞏固濟南鈴木在國IV入門級踏板車型領域絕…

473. 核電站問題

★ 輸入文件:nucle.in 輸出文件:nucle.out 簡單對比 時間限制:1 s 內存限制:128 MB 【問題描述】 一個核電站有 N 個放核物質的坑,坑排列在一條直線上。如果連續 M 個坑中放入核物質,則會發生爆炸&…

js判斷時間是早上還是下午_牛奶早上喝好,還是晚上喝好?沒想到“最佳時間”是這個點,顛覆了!...

都說喝牛奶好,要多喝。可什么時間喝牛奶最好呢?是飯前、飯后還是睡前?又或者喝酒前?確實得好好說說。傳言:空腹時身體比較缺能量,牛奶里的蛋白會去提供能量,不會去構成和修復組織(比如修復皮膚)…

Java模因拒絕死亡

也有標題; 我的寵物討厭Java編碼。 有許多Java模因讓我很煩,部分是因為它們總是一個壞主意,但主要是因為人們在找到更好的替代方案后的幾年里仍在繼續使用它們。 使用StringBuffer代替StringBuilder 從2004年開始,用于StringBuf…

Python TK編程第一部分 Hello Again

當你想寫大一點的程序的時候,將你的代碼封裝到一個或者多個類里會是一個不錯的辦法。下面hello world這個例子來自Matt Conway的Tkinter Life Preserver. [python]view plain copy from Tkinter import * class App: def __init__(self, master): …

視網膜脫離oct報告圖_剛剛,愛爾眼科發布關于艾芬醫生診療過程的核查報告

剛剛,愛爾眼科醫院集團發布關于艾芬女士診療過程的核查報告,內容如下:得悉艾芬女士對武漢愛爾眼科醫院白內障診療存疑,愛爾眼科醫院集團高度重視,第一時間成立了工作組奔赴武漢,對事件的診療全過程開展了核…

20145233《網絡對抗》第二周 后門原理與實踐

20145233《網絡對抗》第二周 后門原理與實踐 實驗內容 windows主機與kali虛擬機實現互聯互通使用netcat獲取主機操作Shell,cron啟動使用socat獲取主機操作Shell, 任務計劃啟動使用MSF meterpreter生成可執行文件,利用ncat或socat傳送到主機并運行獲取主機…

Spring 3.1:緩存和EhCache

如果在網上查找使用Spring 3.1內置緩存的示例,那么通常會碰到Spring的SimpleCacheManager ,Spring的家伙說這對“用于測試或簡單的緩存聲明很有用”。 實際上,我更喜歡將SimpleCacheManager看作是輕量級的,而不是簡單的。 在您希望…

mysql-表完整性約束

閱讀目錄 一 介紹二 not null與default三 unique四 primary key五 auto_increment六 foreign key七 總結一 介紹 回到頂部 約束條件與數據類型的寬度一樣,都是可選參數 作用:用于保證數據的完整性和一致性主要分為: PRIMARY KEY (PK) 標識…

可消費消息數量_17 個方面,綜合對比 主流消息隊列

一、資料文檔二、開發語言三、支持的協議四、消息存儲五、消息事務六、負載均衡七、集群方式八、管理界面九、可用性十、消息重復十一、吞吐量TPS十二、訂閱形式和消息分發十三、順序消息十四、消息確認十五、消息回溯十六、消息重試十七、并發度本文將從,Kafka、Ra…

opencv2.4.13+python2.7學習筆記--使用 knn對手寫數字OCR

閱讀對象:熟悉knn、了解opencv和python。 1.knn理論介紹:算法學習筆記:knn理論介紹 2. opencv中knn函數 路徑:opencv\sources\modules\ml\include\opencv2\ml\ml.hpp 3.案例 3.1數據集介紹 我們的目的是創建一個可以對手寫數字進行…

如何遠程管理Quartz

選項1:JMX 許多人問他們是否可以通過JMX管理Quartz,但我不確定為什么Quartz doc甚至不會提及它。 是的,您可以使用quartz.properties的以下命令啟用石英中的JMX org.quartz.scheduler.jmx.export true之后,您可以使用標準的JMX客…

熱啟動必須聯網嗎_供暖結束,地暖是關閉供水閥門還是關閉回水閥門?你做對了嗎?...

天氣漸漸暖和起來很多城市都停止供暖了一些家庭也停止使用地暖那么今天就來聊一聊,停止供暖后地暖系統應該怎么保養地暖不用時候是關閉供水閥門還是關閉回水閥門?供暖結束 暖氣閥門到底要不要關一般來說,我們供暖期結束是不用關閉總閥門的。因…

python學習(九) 網絡編程學習--簡易網站服務器

python 網絡編程和其他語言都是一樣的,服務器這塊步驟為:1. 創建套接字2. 綁定地址3. 監聽該描述符的所有請求4. 有新的請求到了調用accept處理請求 Python Web服務器網關接口(Python Web Server Gateway Interface,簡稱“WSGI”&…

concurrency 方面的books

http://joeduffyblog.com/2016/11/30/15-years-of-concurrency/轉載于:https://www.cnblogs.com/WCFGROUP/p/6566150.html

Spring 3.1緩存和配置

我最近在博客中談論有關Spring 3.1及其新的緩存注釋Cacheable和CacheEvict 。 與所有Spring功能一樣,您需要進行一定數量的設置,并且通常使用Spring的XML配置文件來完成。 在緩存的情況下,打開Cacheable和CacheEvict并不容易,因為…

按條件分類_保稅倉儲企業能否同時存儲非保貨物?“倉儲貨物安裝臺分類監管”如何申請?...

保稅倉儲企業能否同時存儲非保貨物呢?保稅和非保貨物是不是真的不能同在一個“屋檐下”呢?哪些企業可以開展“倉儲貨物按狀態分類監管”業務?企業又該如何申請該項業務?本文就對這些問題進行一下梳理。什么是“倉儲貨物按狀態分類…

ZooKeeper的原理(轉)

一、ZooKeeper的角色 領導者(Leader),負責進行投票的發起和決議,更新系統狀態。 學習者(Learner),包括跟隨者(Follower)和觀察者(Observer)&#…

java課堂筆記

轉載于:https://www.cnblogs.com/16-C-kai/p/6567042.html

Spring– DAO和服務層

歡迎來到Spring教程的第三部分。 在這一部分中,我們將繼續編寫Timesheet應用程序,這次我們將實現DAO層,業務服務并編寫一些測試。 在上一部分中,我們定義了GenericDao接口,該接口告訴我們需要對實體執行哪些操作。 現在…