一般來說因?yàn)榫植孔兞繉?dǎo)致堆棧越界的問題比較難查,因?yàn)間db保存的也不是第一現(xiàn)場(chǎng)。
以我的經(jīng)驗(yàn)來說,首先應(yīng)該初步估計(jì)出問題的流程,然后在該流程中大量加入打印,通過
打印信息縮小排查范圍,然后結(jié)合代碼走讀查找BUG。
閱讀代碼時(shí)重點(diǎn)注意,局部變量中的數(shù)組大小,以及memset,memcpy類的系統(tǒng)調(diào)用,還有就是循環(huán)賦值語句。
如果問題無法復(fù)現(xiàn)的話,就要碰運(yùn)氣了。
假設(shè)局部變量寫越界不嚴(yán)重的話,可以手動(dòng)推導(dǎo)一部分堆棧中的函數(shù)調(diào)用關(guān)系,要求對(duì)C語言的壓棧過程比較熟悉。
大致上的做法是:
出現(xiàn)SEGV時(shí),查看寄存器esp的值,在根據(jù)esp的值打印出堆棧的信息,如果這部分?jǐn)?shù)據(jù)不是全零的話,說明堆棧被寫越界的太多;否則的話,還是放棄吧。
另一方面要用nm命令把調(diào)試目標(biāo)的符號(hào)表取出,最好按地址排序。
接下來,就是手動(dòng)對(duì)比堆棧中的現(xiàn)場(chǎng)和符號(hào)表了