? ? 作為一個開發(fā)人員,如果你不知道debug那就太low了,在開發(fā)過程中我們經(jīng)常會使用到到一個技能,如果你能很好的使用這個技能,會讓你少掉幾根頭發(fā)(延緩幾年變成禿子^_^),debug是一把好劍,在初期的時候,如果你可以把它用的很6,那你在工作中就可以如魚得水,走的比較順,但是,我們不能過度的依賴debug,我們應(yīng)該在使用debug的過程中學(xué)會的分析軟件產(chǎn)生問題的地方,是什么原因?qū)е铝诉@個問題,這才是終極目標(biāo),做到手中無劍,心中有劍的最高境界,就像劉欣老師在他的一篇文章《不加斷點調(diào)試的程序員是好程序員》一樣:http://user.qzone.qq.com/14703250/2。
在開發(fā)階段IDE提供了debug這個神器,能讓我們定位問題變得更加容易,但是在真正的生產(chǎn)環(huán)境還是會發(fā)生許多我們無法預(yù)知的故障,你不可能在生產(chǎn)環(huán)境上 去裝一個eclipse去debug吧,好吧,我們還有秘密武器,可以查看日志記錄,可是如果某些故障發(fā)生在我們沒有記錄的地方呢,哈哈,傻眼了吧。
下面記錄了前輩就一個實際的生產(chǎn)故障進(jìn)行問題的分析定位的過程:
問題:高CPU占用
根據(jù)top命令,發(fā)現(xiàn)PID為28555的Java進(jìn)程占用CPU高達(dá)200%,出現(xiàn)故障,圖例如下:

通過ps aux | grep PID命令,可以進(jìn)一步確定是tomcat進(jìn)程出現(xiàn)了問題。但是,接下來怎么定位到具體線程或者代碼呢?

然后將需要的線程ID轉(zhuǎn)換為16進(jìn)制格式:printf "%x\n" tid
最后通過?java 自帶的故障分析工具 jstack 抓取線程快照:jstack pid|grep tid -A 30,找到有問題的JAVA代碼,進(jìn)行業(yè)務(wù)調(diào)整和編碼修改

總結(jié)排查CPU故障的方法和技巧 :
1、top命令:Linux命令??梢圆榭磳崟r的CPU使用情況。也可以查看最近一段時間的CPU使用情況。
2、PS命令:Linux命令。強大的進(jìn)程狀態(tài)監(jiān)控命令。可以查看進(jìn)程以及進(jìn)程中線程的當(dāng)前CPU使用情況。屬于當(dāng)前狀態(tài)的采樣數(shù)據(jù)。
3、jstack:Java提供的命令??梢圆榭茨硞€進(jìn)程的當(dāng)前線程棧運行情況。根據(jù)這個命令的輸出可以定位某個進(jìn)程的所有線程的當(dāng)前運行狀態(tài)、運行代碼,以及是否死鎖等等。
4、pstack:Linux命令??梢圆榭茨硞€進(jìn)程的當(dāng)前線程棧運行情況。