2013-04-16 37 views
1

我想調試一個我沒有符號文件的應用程序。我明白,如果我缺少必要的調試信息,需要在彙編級別進行調試。由於我沒有調試符號,我不能直接在方法名稱上設置斷點,但是我仍然應該能夠在地址上設置斷點。GDB不停止在第一個帶有break _start或info文件的機器代碼指令入口點地址

所以我只是試圖設置在入口地址斷點,這是我做的:

[email protected]$ gdb 
(gdb) file someexecutable 
(gdb) info file 

的最後一個命令返回以下入口點: enter image description here

具有地址後,我只是說:

(gdb) break *0x0000000100119ec8 
(gdb) run 

不幸的是,目標應用程序啓動時沒有打破入口點,所以我試過它又一次,但是這次我在入口點地址後面的幾個地址上設置了斷點 - 沒有成功。

下一個嘗試是試圖通過Igor Skochinsky的解決方案,他張貼在這個問題(Stopping at the first machine code instruction in GDB)來設置斷點:

(gdb) b _start 
(gdb) b start 

但是這兩個命令導致了同樣的錯誤:

No symbol table is loaded. Use the "file" command.

嗯,顯然我需要調試符號才能正常工作。後來我想也許它只是表明一個不正確的入口點的地址,所以我用命令驗證它:

[email protected]$ otool -l someexecutable 

並取得了以下的輸出: enter image description here

所以它似乎是相同的入口點GDB返回。現在我不知道我還能嘗試什麼。 :) 也許你們有什麼我可以嘗試的想法。任何幫助將非常感激。如果有些事情不清楚,或者我錯過了一些重要的信息,請留下簡短的評論。

+0

我不重現在GDB 7.7.1,GCC 4.8和hello world:地址和符號方法都有效。可執行文件到底是如何生成的?什麼是GDB版本? –

回答

1

這看起來像GDB中的一個bug給我。我猜測ASLR會將二進制文件重定位到另一個地址,但GDB不會移動該斷點。我建議下列之一:

  1. 禁用ASLR:set disable-aslr on
  2. 集的環境變量DYLD_NO_PIE=1
  3. 從可執行的頭
  4. 刪除MH_PIE標誌補丁入口點到的0xCC。一旦中斷,您可以將其修補回原始字節。
+0

真棒,看到你下降,以幫助我的問題!正如你所建議的,我嘗試禁用ASLR或設置env var,但不幸的是這些不起作用(它仍然「跳過」斷點)。對於後面的兩個選項,我不得不做一些研究,因爲我對達爾文的二進制文件不是很熟悉,明天會給它一個鏡頭,如果我取得任何進展,請回報。 :) – beta

+0

不幸的是這些解決方案都不適合我。不過,我現在正在關閉它,因爲我取消了這個項目的工作。不管怎麼說,還是要謝謝你。 – beta