我正在學習用gdb解決一些運行時錯誤。這裏是我的問題:在調試中查找地址信息
時發生運行時錯誤,因爲一些內存的一些訪問操作是矛盾的,我可以找出在轉儲核心內存的地址?
給定一個地址,是否有可能找出哪個變量正在使用它(地址可能在變量內存的開始,結束或中間)?
考慮到變量使用的內存,是否有可能找到它下面和其上方的附近變量?
感謝和問候!
我正在學習用gdb解決一些運行時錯誤。這裏是我的問題:在調試中查找地址信息
時發生運行時錯誤,因爲一些內存的一些訪問操作是矛盾的,我可以找出在轉儲核心內存的地址?
給定一個地址,是否有可能找出哪個變量正在使用它(地址可能在變量內存的開始,結束或中間)?
考慮到變量使用的內存,是否有可能找到它下面和其上方的附近變量?
感謝和問候!
通常是的。假設你的程序 墜毀GDB外,由於SIGSEGV
並留下了一個核心轉儲,您可以:
答:找出哪些 指令實際上造成了 訪問衝突:
(gdb) x/i $pc
這通常是一個內存訪問 指令,例如"movl $1,8(%eax)"
。重要的是 那麼應該指向有效的 內存的寄存器 有什麼價值。
B.找出寄存器的值 :
(gdb) p/x $eax
通常這會是0(你是 通過NULL
指針寫), 或一些廢話值,例如 0x32314043
(您損壞了 指針,或者用 ASCII
字符串覆蓋了它)。
的GDB
"info symbol"
命令會告訴你哪個符號 (如果有的話)是給定的地址附近。
使用相同的"info symbol"
命令來獲得稍微小一點的地址,並且稍微大於「目標」變量的地址。
更新:
的info symbol
不在本地(自動)變量的工作方式,因爲這樣的變量沒有與之關聯的(符號表)標誌。
要查找有關局部變量的信息,請執行"info locals"
。然後,您可以打印他們的地址與
(gdb) print &a_local_variable
我不知道有沒有辦法做逆(即局部變量的地址映射回其符號名稱)。但是,如果您只有少數本地人,通常「手工」將地址映射到其中一個地方通常很簡單。如果你有太多的本地人,這是一個糟糕的「代碼味道」 - 你應該重構你的代碼,這樣你就不會這樣做。
非常感謝! 看起來像「信息符號」只適用於全局變量或非靜態變量,但對本地非靜態變量的內存地址不起作用,即使我與該變量處於同一幀。那麼如何找出使用給定地址的本地非靜態變量?如果它可以是有用的,爲什麼「信息符號」不支持它? – Tim 2009-08-29 19:46:01
非常感謝@Employed,這幫助我解決了另一個問題 – tmow 2012-01-25 16:41:04
「我不知道有什麼方法可以做相反的事情」 - 有時「info scope」可以幫助確定當前堆棧中某個地方的哪些本地生活幀,儘管它的輸出通常很長並且需要一些解密。 – 2015-08-06 07:50:46