2011-08-02 77 views
8

是否可以調試由不帶gdb標誌編譯的可執行文件生成的核心文件?是否有可能調試由不帶gdb標誌編譯的可執行文件生成的核心文件?

如果是的話,任何指針或教程呢?

+0

你指的是什麼gdb標誌?你的意思是-g標誌(調試標誌) – Pradeep

+1

正如你的一個很好的答案所表明的那樣,組裝級調試就是你所能得到的。它可以完成,但這並不容易,並且不會有'教程'。您將不得不學習程序運行的處理器的彙編語言。 – Omnifarious

+0

瞭解操作系統,CPU體系結構和目標文件格式以使其成爲更明智的問題可能會有幫助。你能提供這些信息嗎? – Jens

回答

14

是,您可以: GDB可執行核心文件

更多您可以找到。這並不容易。我會給你一個例子。

比方說,我有以下程序調用foo.c的

main() 
{ 
    *((char *) 0) = '\0'; 
} 

我編譯它,並確保沒有符號:

$ cc foo.c 
$ strip a.out 
$ file a.out 
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped 

好了,時間運行它:

$ ./a.out 
Segmentation fault (core dumped) 

糟糕。似乎有一個錯誤。讓我們開始一個調試器:

$ gdb ./a.out core 
[..] 
Reading symbols from /tmp/a.out...(no debugging symbols found)...done. 
[..] 
Core was generated by `./a.out'. 
Program terminated with signal 11, Segmentation fault. 
#0 0x0804839c in ??() 
(gdb) bt 
#0 0x0804839c in ??() 
#1 0xb7724e37 in __libc_start_main() from /lib/i386-linux-gnu/libc.so.6 
#2 0x08048301 in ??() 

嗯,看起來不好。沒有符號。我們能弄清楚發生了什麼?

(gdb) x/i $eip 
=> 0x804839c: movb $0x0,(%eax) 

看起來它試圖存儲一個值爲零的字節到EAX寄存器指向的存儲器位置。爲什麼失敗?

(gdb) p $eax 
$1 = 0 
(gdb) 

它失敗,因爲EAX寄存器指向一個內存地址零,並試圖將一個字節在該地址存儲。哎呀!

不幸的是,我沒有指向任何優秀教程的指針。搜索「gdb反向工程」可以得到一些可能有幫助的鏈接。

更新:

我注意到了評論,這是關於在客戶調試核心轉儲。當您將剝離的二進制文件發送給客戶時,應始終保留該二進制文件的調試版本。

我會建議不剝離,甚至給源代碼。我編寫的所有代碼都通過源代碼發送給客戶。我一直在客戶方面面對一家無能的供應商,這家供應商已經發布了一小段軟件,但不知道如何解決這個問題。它很爛。

這似乎是實際上這個問題的重複:

Debug core file with no symbols

有一些額外的信息出現。

-2

如果程序編譯時沒有-g標誌,則無法調試核心文件。

否則,你可以這樣做的: http://wwwpub.zih.tu-dresden.de/~mlieber/practical_debugging/04_gdb.pdf

+1

因此,在大多數客戶場景中,它們的可執行文件將被編譯爲不帶gdbflag -g的對吧?那麼我們如何調試客戶場景下生成的核心轉儲? – Hemanth

+0

根據客戶的情況,我認爲你正在討論發佈的build或exe。因此,根據我的經驗,對於核心轉儲,調試是不可能的。您可能會等待一些更好的答案,以便我也可以從中受益:) – Pradeep

+0

根據我的經驗,發佈版本仍然使用-g編譯(即使使用-O3等優化)。這確保了*一些*可調試性。可執行文件被複制到檔案中。然後,從可執行文件(包括庫)中去除符號,然後將其歸檔。最後,無符號版本被公開發布。然後,您可以告訴gdb將可執行文件設置爲可調試的可執行文件,同時使用可執行文件中的核心文件剝離符號。然後GDB的開心和一切都「有效」(就像調試優化的可執行文件一樣)。 – inetknght

2

是的,你可以, 這是人誰寫的,即裂縫都在做, 不幸的是我沒有滑梯和一個當然我也跟着上大學了文件,但google搜索reverse engineeringdisassembly tutorials會給你一些起點。也知道你在彙編代碼中的方式是至關重要的。

我們班是基於一本書,主要章節1 & 3,但有一個新的版本出來現在

Computer Systems: A programmer's perspective by R.E. Bryant and D.R. O'Hallaron

這也解釋了計算機系統背後的基本知識,也讓你的工作非常瞭解系統中的程序。

此外,當學習這一點時要注意,64位cpu具有不同於32位cpu的彙編代碼,以防萬一。

相關問題