2013-05-07 91 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'噢!)的深入理解对于成为一个好的调试器都是必需的。

我希望这能找到你。并一如既往---负责任地进行破解。