2013-05-07 94 views
3

我嘗試編寫簡單的應用程序,每當發生任何錯誤時,都會嘗試調試並理解導致錯誤的原因。學習彙編語言如何幫助我調試C程序?

正如標題中所述,學習彙編語言如何幫助我調試C程序? 同樣,彙編語言的所有主題都是必需的。我不想掌握彙編語言,但考慮學習相同的知識來更好地理解過程。

PPS:主題的鏈接會很好。

謝謝!

+2

除非您進行嵌入式開發,否則調試器已經足夠多年,您不必瞭解彙編器或CPU寄存器就可以調試程序。但是,瞭解彙編程序可以幫助您瞭解計算機_works_下面的所有庫和抽象,幫助您瞭解內存佈局和指針,並幫助您成爲更好的C程序員。 – 2013-05-07 10:03:46

回答

3

老實說,它不會。也就是說,學習程序集對於幫助您專門調試您的C代碼(除了一些特殊情況,如微控制器/嵌入式系統項目)幾乎沒有什麼幫助。如果您已經知道知道彙編,它可以提供幫助,但即使如此,根據我的經驗,使用C和彙編以及一些非常強大的調試器,在我看來,以這種方式調試代碼效率低下。這就是說,我絕對會鼓勵任何人去探索彙編,並儘可能多地學習它,甚至寫一些彙編代碼。它將提供關於程序如何在更低層次工作的其他重要見解。而且,在某些情況下,它甚至可能很有趣。

至於調試,Linux的gdb和Windows的visual studio debugger等工具應該是您調試C代碼時的第一道防線。我很少打開我的程序集文件,試圖追蹤我的C代碼中的錯誤。我更多時候會因好奇而打開它。

如果您有興趣瞭解有關裝配的一般信息,有大量資料只是Google的簡短搜索,以及各種有關此主題的優秀書籍。我在學校使用的一本書(並且仍在使用)是Computer Systems: A Programmer's Perspective,它並沒有涵蓋很多程序集,但是從程序員的角度來講,它將教你關於低級計算的內容。它將解釋我們作爲程序員如何可以用低級計算編寫代碼,而我認爲這是您的問題的核心。簡而言之:我鼓勵任何人去探索彙編,但我會建議使用其他工具進行調試,然後通過查看彙編來嘗試調試C代碼。

1

有assmebly的知識可以幫助你undertsand什麼是你的程序內部運行。特別是bufferoverruns可能很難追查到,最糟糕的情況是應用程序在某處完全沒有關係,你不知道它是如何到達那裏的。如果編譯器有一個錯誤,而且你不知道你的代碼爲什麼沒有做它應該做的,它也會有所幫助。

一個簡單的方法是編寫一個小而簡單的C程序,讓編譯器爲您生成彙編文件。然後,您可以查看生成的實際代碼,而無需瞭解分段設置和聲明數據的所有醜陋細節。

例如:

main() 
{ 
    int a = 3, 
    int b = 5; 
    int c = 0; 
    c = a+b; 

    printf("%d\n", c); 
} 

一個簡單的程序,你確切地知道它應該做的。查看生成的代碼可以讓你理解它是如何工作的,你可以繼續使用更復雜的東西,例如使用指針等。

涉及的說明並不複雜,如果沒有深入的裝配知識,可以輕鬆理解。

0

我同意彙編程序的知識可以幫助您調試c程序。我會建議你做兩件事。隨意混合和混合:-)

FIRST:獲取關於x86(IA-32)彙編語言的入門書籍。有幾個可用的好書,如:

「指南匯編語言編程在Linux的」

「彙編語言的x86處理器」

購買或檢查出來的音樂庫中(libgen/bookfi) 。我閱讀了「Linux中彙編語言編程指南」,這是一個好的開始。艱難的我寧願閱讀「x86處理器的彙編語言」。是的,這些都是相當大的書,但是他們也有一個很長的介紹,你可能會(想)跳過,並且你不必爲了獲得彙編程序的介紹而直接閱讀這些書。第二步:編寫簡單的c程序,並使用gcc -S將它們編譯爲彙編程序,然後使用gdb遍歷它們並嘗試理解它們的作用。如果你無法弄清楚指令的作用,你會發現很多教程和評論的代碼可以幫助你。

如果你不能像你想的那樣快速地理解所有東西,不要灰心。現在,你有了一個彙編程序的介紹,現在是時候加強(遊戲/板塊/無論什麼)。嘗試爲榜樣(即運行在大腦/機器&調試代碼)這些職位:

http://www.phrack.org/issues.html?issue=49&id=14#article 這是普遍認爲「德藝雙馨堆棧的樂趣和利潤」的阿萊夫一個。您會在本網站上發現許多與本文相關的文章;-)但要小心:如果您想在家中嘗試使用,請使用gcc -fno-stack-protector。

https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free 這不是真的關於彙編語言的文章,但它是正確的問題。它使用了對彙編和其他工具的理解來創建(調試)一段代碼,它非常詳細,它會給你提供進一步的提示,指出哪些技能對調試有用。

現在你將會看到,不僅彙編程序的知識是有用的,而且對堆棧和堆棧機制(以及調試工具,d'噢!)的深入理解對於成爲一個好的調試器都是必需的。

我希望這能找到你。並一如既往---負責任地進行破解。