使用Windbg调试StackOverflowException异常
最近公司服務(wù)器端程序遇到一個(gè)堆棧溢出問(wèn)題,偏偏是偶發(fā)性但是又在相對(duì)固定時(shí)間發(fā)生的,有一個(gè)服務(wù)器比較容易觸發(fā),平均隔個(gè)5、6天就會(huì)發(fā)生一次,且每次都是在8點(diǎn)23分左右拋出異常。服務(wù)器開發(fā)同事初步定位是定時(shí)器出了問(wèn)題,單純看代碼看不出問(wèn)題,打的log也沒(méi)看到有用的信息(其實(shí)這里是有點(diǎn)能力問(wèn)題的,囧~看代碼也看得不認(rèn)真不細(xì)致。打的log沒(méi)打到點(diǎn)上)。老大就把這個(gè)問(wèn)題拋給我,讓我去解決一下,提示用一些工具直接去測(cè),比如Windbg,于是開始了Windbg之旅。
上網(wǎng)搜索了下Windbg相關(guān)的博客,主要從以下兩篇文章中受益頗多。
文1 .NET應(yīng)用程序調(diào)試—原理、工具、方法
文2 WinDbg-如何抓取dump文件
Windbg工具下載地址:http://www.microsoft.com/whdc/devtools/debugging/default.aspx
看完文章后決定使用分析dmp文件的方式來(lái)解決這次的問(wèn)題。
首先是獲取dump文件。雖然用Windows系統(tǒng)自帶的任務(wù)管理器可以方便地dump文件,但是由于64位系統(tǒng)和32位進(jìn)程(發(fā)生問(wèn)題的后臺(tái)程序)的問(wèn)題,這種方式獲得的dmp文件用Windbg分析不出東西,老是會(huì)報(bào)一些錯(cuò),所以采用其他方式,比較靠譜的有兩種,從上面文章中分別有提到。
一是文1提到的使用Windows調(diào)試工具箱中的ntsd工具,步驟為:1、cmd運(yùn)行命令“Windows調(diào)試工具箱安裝目錄\x86\tlist”查看所有進(jìn)程的PID,找到crash進(jìn)程的id。2、cmd運(yùn)行命令“Windows調(diào)試工具箱安裝目錄\x86\ntsd -pv -p 進(jìn)程PID”。3、ntsd界面中運(yùn)行命令“.dump/mf dmp文件路徑”即生成dmp文件。
二是文2提到的直接使用Windbg來(lái)dump文件,打開“Windows調(diào)試工具箱安裝目錄\x86\windbg.exe”,點(diǎn)擊File->Attach to a Process->選擇crash的進(jìn)程->點(diǎn)擊確定,進(jìn)到抓取dump的界面,在命令行中輸入“.dump -ma dmp文件路徑”生成dmp文件。
注意,這里的操作步驟都需要到發(fā)生crash的機(jī)器上且要在發(fā)生crash后沒(méi)關(guān)閉進(jìn)程之前去執(zhí)行;另外這里使用的是x86下的工具箱,具體的選擇可參照這篇文章 Windbg 32位版本和64位版本的選擇 。
拿到dmp文件后就可以用x86版本的Windbg工具打開了。這里簡(jiǎn)要寫幾個(gè)調(diào)試時(shí)用到的命令。使用方法文1文2都有提到。
.sympath 路徑
.symfix+ 路徑
.reload
.loadby sos clr
!analyze -v
!threads
~0s
!clrstack
這里設(shè)置符號(hào)路徑時(shí)最好是程序所在目錄,且?guī)в衟db文件。使用!threads獲取所有線程的時(shí)候,哪個(gè)線程發(fā)生了Exception會(huì)顯示出來(lái),使用~0s命令進(jìn)入線程,使用!clrstack可以看到調(diào)用堆棧,從而可以看到問(wèn)題所在了。
大致是這樣子,我看到了出現(xiàn)問(wèn)題的代碼,原來(lái)有個(gè)定時(shí)事件發(fā)生在每天的5.50分,在觸發(fā)時(shí)因?yàn)榇a問(wèn)題,會(huì)有小概率沒(méi)把這個(gè)下次時(shí)間(即明天5.50分)正確設(shè)置,導(dǎo)致今天的事件一直處于觸發(fā)中,而每次定時(shí)器輪詢是3秒間隔,到8.23分的時(shí)候剛好堆棧溢出。
至此,問(wèn)題解決。第一次寫博客,不怎么會(huì)編輯,將就著看先。因?yàn)闀r(shí)間不夠,內(nèi)容也不詳細(xì),之后慢慢補(bǔ)充完整。
轉(zhuǎn)載于:https://www.cnblogs.com/qiups/p/5654544.html
總結(jié)
以上是生活随笔為你收集整理的使用Windbg调试StackOverflowException异常的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 分治最小割 学习总结
- 下一篇: Redis 和 Memcached 的区