回答
是,您可以: 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
有一些額外的信息出現。
如果程序編譯時沒有-g標誌,則無法調試核心文件。
否則,你可以這樣做的: http://wwwpub.zih.tu-dresden.de/~mlieber/practical_debugging/04_gdb.pdf
因此,在大多數客戶場景中,它們的可執行文件將被編譯爲不帶gdbflag -g的對吧?那麼我們如何調試客戶場景下生成的核心轉儲? – Hemanth
根據客戶的情況,我認爲你正在討論發佈的build或exe。因此,根據我的經驗,對於核心轉儲,調試是不可能的。您可能會等待一些更好的答案,以便我也可以從中受益:) – Pradeep
根據我的經驗,發佈版本仍然使用-g編譯(即使使用-O3等優化)。這確保了*一些*可調試性。可執行文件被複制到檔案中。然後,從可執行文件(包括庫)中去除符號,然後將其歸檔。最後,無符號版本被公開發布。然後,您可以告訴gdb將可執行文件設置爲可調試的可執行文件,同時使用可執行文件中的核心文件剝離符號。然後GDB的開心和一切都「有效」(就像調試優化的可執行文件一樣)。 – inetknght
是的,你可以, 這是人誰寫的,即裂縫都在做, 不幸的是我沒有滑梯和一個當然我也跟着上大學了文件,但google搜索reverse engineering
或disassembly tutorials
會給你一些起點。也知道你在彙編代碼中的方式是至關重要的。
我們班是基於一本書,主要章節1 & 3,但有一個新的版本出來現在
Computer Systems: A programmer's perspective by R.E. Bryant and D.R. O'Hallaron
這也解釋了計算機系統背後的基本知識,也讓你的工作非常瞭解系統中的程序。
此外,當學習這一點時要注意,64位cpu具有不同於32位cpu的彙編代碼,以防萬一。
- 1. 調試不帶gdb標記的圖像的核心文件-g
- 2. GDB +另一個編譯器生成的核心轉儲文件
- 3. 調試C++從GDB的核心文件
- 4. (Mac)離開核心文件的可執行文件而不是/核心?
- 5. 可執行文件是否帶有調試信息?
- 6. 是否有可能生產獨立的haskell可執行文件
- 7. 編譯的C文件不可執行
- 8. 如何編譯成可執行文件
- 9. 由nodejs應用程序生成的調試核心文件
- 10. GDB核心轉儲:通過build-id查找可執行文件
- 11. 通過makefile編譯 - 沒有生成可執行文件?
- 12. gdb 7.5.1調試可執行文件的問題通過g生成4.7.2
- 13. GDB腳本 - 只有在沒有調試核心文件時才執行命令
- 14. Visual Studio不生成調試可執行文件?
- 15. py2exe可執行文件生成日誌文件錯誤
- 16. 如何使用GDB調試Android上的Dalvik可執行文件?
- 17. 使用gdb從腳本啓動的可執行文件調試
- 18. 是否可以從Windows RT生成可執行文件?
- 19. 如何在Windbg中調試由FASM編譯的Windows x64可執行文件?
- 20. 如何編寫生成文件以在不同的目錄中生成目標文件和可執行文件?
- 21. makefile不生成可執行文件
- 22. 如何從Eclipse內部調試外部編譯的C++可執行文件(使用調試標誌集)?
- 23. 調試由valgrind生成的核心
- 24. 安裝ruby debug19。編譯器無法生成可執行文件
- 25. 在buildbot中編譯命令生成python可執行文件
- 26. 生成最快的可執行文件
- 27. 具有兩個可執行文件的遞歸生成文件
- 28. 不能編譯可執行文件的CMake
- 29. 生產可執行文件在Linux(相對於執行編譯)
- 30. 是否有可能在sbt插件中編譯文件?
你指的是什麼gdb標誌?你的意思是-g標誌(調試標誌) – Pradeep
正如你的一個很好的答案所表明的那樣,組裝級調試就是你所能得到的。它可以完成,但這並不容易,並且不會有'教程'。您將不得不學習程序運行的處理器的彙編語言。 – Omnifarious
瞭解操作系統,CPU體系結構和目標文件格式以使其成爲更明智的問題可能會有幫助。你能提供這些信息嗎? – Jens