我想調試一個我沒有符號文件的應用程序。我明白,如果我缺少必要的調試信息,需要在彙編級別進行調試。由於我沒有調試符號,我不能直接在方法名稱上設置斷點,但是我仍然應該能夠在地址上設置斷點。GDB不停止在第一個帶有break _start或info文件的機器代碼指令入口點地址
所以我只是試圖設置在入口地址斷點,這是我做的:
[email protected]$ gdb
(gdb) file someexecutable
(gdb) info file
的最後一個命令返回以下入口點:
具有地址後,我只是說:
(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
並取得了以下的輸出:
所以它似乎是相同的入口點GDB返回。現在我不知道我還能嘗試什麼。 :) 也許你們有什麼我可以嘗試的想法。任何幫助將非常感激。如果有些事情不清楚,或者我錯過了一些重要的信息,請留下簡短的評論。
我不重現在GDB 7.7.1,GCC 4.8和hello world:地址和符號方法都有效。可執行文件到底是如何生成的?什麼是GDB版本? –