排錯(cuò)手段-打印堆棧

讀者看見打印堆棧可能會(huì)比較疑惑為什么要打印堆棧,不是調(diào)試的時(shí)候能看見堆棧信息么澈缺,那我先列舉如下的兩個(gè)場景:

場景展示

目標(biāo)方法如下(可以先不看):

public void acceptTask(Player player, int modelId, boolean isLogin) {
    log.error(TaskHelp.getPlayerInfo(player)+"開始接日常任務(wù):"+modelId + " isLogin: "+isLogin);
    //省略其他代碼
}

下面的場景借上面的那個(gè)方法來展開說明
場景一:

  1. 小明在本地開發(fā)游戲時(shí)出現(xiàn)一個(gè)問題(即玩家在請求一鍵完成任務(wù)的時(shí)候怎憋,最后還有一個(gè)任務(wù)沒有完成)淌哟,查閱日志(即目標(biāo)方法唯一粘貼的語句)發(fā)現(xiàn)原因就是acceptTask方法被不正當(dāng)?shù)恼{(diào)用了一次,那個(gè)沒有完成的任務(wù)就是因?yàn)槎嘟尤×艘淮巍?/li>
  2. 小明說好吧拗小,那我看看這個(gè)方法被哪些地方調(diào)用了,結(jié)果一看樱哼,媽呀哀九,幾十處被調(diào)用的地方。小明本意是想著如果只有這么一兩處調(diào)用唇礁,直接看看排查一下就行了的勾栗。幾十處有點(diǎn)多。
  3. 小明心想我調(diào)試一下看看堆棧就知道了盏筐,于是斷點(diǎn)就設(shè)置在acceptTask方法的第一行围俘,程序一運(yùn)行,誒不對啊琢融,斷點(diǎn)都進(jìn)來幾十次了界牡,還是沒有發(fā)現(xiàn)一些異常堆棧信息。

場景二:

  1. 還是同樣的問題出現(xiàn)在了正式的運(yùn)行的服務(wù)器上面漾抬,沒法調(diào)試宿亡。

問題解決

哈哈,‘小明’就是我自己咯纳令,只是不好意思當(dāng)時(shí)查找這個(gè)問題費(fèi)了很多時(shí)間挽荠。

好了言歸正傳克胳,我以前只注意到在我們程序報(bào)錯(cuò)的時(shí)候會(huì)打印錯(cuò)誤堆棧信息。但是我的程序沒有報(bào)錯(cuò)圈匆,而是邏輯錯(cuò)了漠另,于是我就google了一下,我們可以通過如下的方法來打印調(diào)用到此處的線程的目前的堆棧信息跃赚。

public void acceptTask(Player player, int modelId, boolean isLogin) {
    log.error(TaskHelp.getPlayerInfo(player)+"開始接日常任務(wù):"+modelId + " isLogin: "+isLogin);
    Thread.dumpStack();
}

其實(shí)就一行還是JDKThread自帶的笆搓,Thread.dumpStack();我的那處出問題的邏輯就是這樣發(fā)現(xiàn)的。打印的信息類似異常堆棧信息纬傲,在控制臺(tái)是紅色的比較醒目满败。

善后處理

進(jìn)入dumpStack內(nèi)部:

public static void dumpStack() {
    new Exception("Stack trace").printStackTrace();
}

其實(shí)這個(gè)和我們的異常堆棧信息打印是一樣的:

try {
    //邏輯代碼
} catch (Exception e) {
    e.printStackTrace(System.out);
}

只是dumpStackException對象是我們自己new的,而異常堆棧是JVM創(chuàng)建的叹括,所以在問題查找到以后應(yīng)該及時(shí)清理掉這處代碼算墨,避免無用對象的創(chuàng)建和回收。

總結(jié)

什么時(shí)候我們應(yīng)該打印堆棧领猾?

  1. 類似場景一米同,那種即便是可以調(diào)試,但是干擾消息太多的情況下摔竿。
  2. 高并發(fā)的場景真的不太好調(diào)試的時(shí)候面粮。
  3. 類似場景二,無法調(diào)試继低,如果目標(biāo)代碼可以熱加載熬苍,那就加上Thread.dumpStack();,然后再加載一次。

PS:其他一些需要堆棧信息的情況袁翁?

  1. 運(yùn)行中的程序出現(xiàn)了死鎖柴底,死循環(huán),這些情況線程幾乎是靜止的(就是出問題的線程沒有棧幀的壓入和壓出)粱胜。這些情況就比較好辦直接使用jvm的jstack工具就行了柄驻,這兒我打算寫一篇文章,以后寫好了焙压,鏈接過來鸿脓。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涯曲,隨后出現(xiàn)的幾起案子野哭,更是在濱河造成了極大的恐慌,老刑警劉巖幻件,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拨黔,死亡現(xiàn)場離奇詭異,居然都是意外死亡绰沥,警方通過查閱死者的電腦和手機(jī)篱蝇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門贺待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人态兴,你說我怎么就攤上這事狠持。” “怎么了瞻润?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甜刻。 經(jīng)常有香客問我绍撞,道長,這世上最難降的妖魔是什么得院? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任傻铣,我火速辦了婚禮,結(jié)果婚禮上祥绞,老公的妹妹穿的比我還像新娘非洲。我一直安慰自己,他們只是感情好蜕径,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布两踏。 她就那樣靜靜地躺著,像睡著了一般兜喻。 火紅的嫁衣襯著肌膚如雪梦染。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天朴皆,我揣著相機(jī)與錄音帕识,去河邊找鬼。 笑死遂铡,一個(gè)胖子當(dāng)著我的面吹牛肮疗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扒接,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼伪货,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了珠增?” 一聲冷哼從身側(cè)響起超歌,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒂教,沒想到半個(gè)月后巍举,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凝垛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年懊悯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜓谋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炭分,死狀恐怖桃焕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捧毛,我是刑警寧澤观堂,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站呀忧,受9級特大地震影響师痕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜而账,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一胰坟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泞辐,春花似錦笔横、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汽烦,卻和暖如春涛菠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撇吞。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工俗冻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牍颈。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓迄薄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親煮岁。 傳聞我的和親對象是個(gè)殘疾皇子讥蔽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,321評論 8 265
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法画机,內(nèi)部類的語法冶伞,繼承相關(guān)的語法,異常的語法步氏,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 馬上中秋節(jié)了响禽,因?yàn)樗旅Γ蕴崆鞍阎星锒Y給我爸媽送去。 下班后打電話給他芋类,來接我隆嗅。因?yàn)閷W(xué)校有些事,就耽擱了一會(huì)兒...
    嘉一粒閱讀 178評論 0 1
  • 孩子丽焊,你已經(jīng)參加軍訓(xùn)有四天時(shí)間了,估計(jì)現(xiàn)在已經(jīng)適應(yīng)了吧咕别? 這幾天你媽媽整天盯著微信群里的消息粹懒,期盼著里面能夠有一張...
    武哥a閱讀 8,098評論 2 4
  • 2017年3月12日 星期日 雨讀經(jīng):《易經(jīng)》第31遍。運(yùn)動(dòng):掄胳膊0下顷级,蹲墻0下,閉眼金雞獨(dú)立0分鐘确垫,蹲著30...
    順德琪佳媽閱讀 163評論 0 0