2009-08-27 64 views
3

我正在學習用gdb解決一些運行時錯誤。這裏是我的問題:在調試中查找地址信息

  1. 時發生運行時錯誤,因爲一些內存的一些訪問操作是矛盾的,我可以找出在轉儲核心內存的地址?

  2. 給定一個地址,是否有可能找出哪個變量正在使用它(地址可能在變量內存的開始,結束或中間)?

  3. 考慮到變量使用的內存,是否有可能找到它下面和其上方的附近變量?

感謝和問候!

回答

5
  1. 通常是的。假設你的程序 墜毀GDB外,由於SIGSEGV 並留下了一個核心轉儲,您可以:
    答:找出哪些 指令實際上造成了 訪問衝突:

    (gdb) x/i $pc 
    

    這通常是一個內存訪問 指令,例如"movl $1,8(%eax)"。重要的是 那麼應該指向有效的 內存的寄存器 有什麼價值。
    B.找出寄存器的值 :

    (gdb) p/x $eax 
    

    通常這會是0(你是 通過NULL指針寫), 或一些廢話值,例如 0x32314043(您損壞了 指針,或者用 ASCII字符串覆蓋了它)。

  2. GDB"info symbol"命令會告訴你哪個符號 (如果有的話)是給定的地址附近。

  3. 使用相同的"info symbol"命令來獲得稍微小一點的地址,並且稍微大於「目標」變量的地址。

更新:
info symbol不在本地(自動)變量的工作方式,因爲這樣的變量沒有與之關聯的(符號表)標誌。

要查找有關局部變量的信息,請執行"info locals"。然後,您可以打印他們的地址與

(gdb) print &a_local_variable 

我不知道有沒有辦法做逆(即局部變量的地址映射回其符號名稱)。但是,如果您只有少數本地人,通常「手工」將地址映射到其中一個地方通常很簡單。如果你有太多的本地人,這是一個糟糕的「代碼味道」 - 你應該重構你的代碼,這樣你就不會這樣做。

+0

非常感謝! 看起來像「信息符號」只適用於全局變量或非靜態變量,但對本地非靜態變量的內存地址不起作用,即使我與該變量處於同一幀。那麼如何找出使用給定地址的本地非靜態變量?如果它可以是有用的,爲什麼「信息符號」不支持它? – Tim 2009-08-29 19:46:01

+0

非常感謝@Employed,這幫助我解決了另一個問題 – tmow 2012-01-25 16:41:04

+0

「我不知道有什麼方法可以做相反的事情」 - 有時「info scope」可以幫助確定當前堆棧中某個地方的哪些本地生活幀,儘管它的輸出通常很長並且需要一些解密。 – 2015-08-06 07:50:46