當前位置:編程學習大全網 - 源碼下載 - GDB迷路時堆棧指針手動更改問題,怎麽解決

GDB迷路時堆棧指針手動更改問題,怎麽解決

運行時出現了段錯誤,然後來看內存轉儲後得到的內容。

1、首先查看棧幀的內容

(gdb) bt

#0 0x6a696968 in ? ()

#1 0x6c6b6b6a in ? ()

#2 0x6e6d6d6c in ? ()

#3 0x706f6f6e in ? ()

#4 0x72717170 in ? ()

#5 0x74737372 in ? ()

#6 0xbff60074 in ? ()

Backtrace stopped: previous frame inner to this frame (corrupt stack?)

棧中所有函數指針全部顯示成“?”,從中無法獲取任何信息,這種情況可以懷疑是棧緩沖溢出。

然後看最後1行,它就提示我們有可能是棧指針出現的錯誤,所以我們需要做的事情就是去查看這個棧指針怎麽回事。

(gdb) x/30c $esp-15

0xbff6a311: 99 'c' 99 'c' 100 'd' 100 'd' 101 'e' 101 'e' 102 'f' 102 'f'

0xbff6a319: 103 'g' 103 'g' 104 'h' 104 'h' 105 'i' 105 'i' 106 'j' 106 'j'

0xbff6a321: 107 'k' 107 'k' 108 'l' 108 'l' 109 'm' 109 'm' 110 'n' 110 'n'

0xbff6a329: 111 'o' 111 'o' 112 'p' 112 'p' 113 'q' 113 'q'

(gdb) p (char *)$esp-20

$1 = 0xbff6a30c "\005aabbccddeeffgghhiijjkkllmmnnooppqqrrsstt"

(gdb) p (char *)$esp+20

$2 = 0xbff6a334 "t"

發現在寄存器esp兩邊都是字符串,問題就出在這裏了:原來調用函數時推入到棧中的跳轉指針被字符串給覆蓋了,結果在函數返回的時候,找不到返回的地址,出現了段錯誤。

3、定位源碼中的錯誤。

  • 上一篇:女子抽中5899元手機福袋被寄模型機,直播間行為算欺詐嗎?
  • 下一篇:Mapbox源碼分析(2)url解析
  • copyright 2024編程學習大全網