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