Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
学习汇编语言如何帮助我调试C程序?_C_Debugging_Assembly_Gdb - Fatal编程技术网

学习汇编语言如何帮助我调试C程序?

学习汇编语言如何帮助我调试C程序?,c,debugging,assembly,gdb,C,Debugging,Assembly,Gdb,我尝试编写简单的应用程序,每当出现任何错误时,我都会尝试调试并理解导致错误的原因 如标题所述,学习汇编语言如何帮助我调试C程序? 同样,汇编语言的所有主题都是相同的 PS:我对掌握汇编语言不感兴趣,但正在考虑学习汇编语言,以便更好地理解这个过程 PPS:链接到主题会很好 谢谢 我不确定你到底想要什么。但是下面的链接可能对你有用 了解assmebly有助于了解程序内部的情况。特别是缓冲区溢出可能很难追踪,在最坏的情况下,应用程序会在完全不相关的地方崩溃,而您不知道它是如何出现的。如果编译器有一个b

我尝试编写简单的应用程序,每当出现任何错误时,我都会尝试调试并理解导致错误的原因

如标题所述,学习汇编语言如何帮助我调试C程序? 同样,汇编语言的所有主题都是相同的

PS:我对掌握汇编语言不感兴趣,但正在考虑学习汇编语言,以便更好地理解这个过程

PPS:链接到主题会很好


谢谢

我不确定你到底想要什么。但是下面的链接可能对你有用


了解assmebly有助于了解程序内部的情况。特别是缓冲区溢出可能很难追踪,在最坏的情况下,应用程序会在完全不相关的地方崩溃,而您不知道它是如何出现的。如果编译器有一个bug,而您不知道为什么您的代码没有完成它应该做的事情,那么它也会有所帮助

一个简单的方法是编写一个小而简单的C程序,让编译器为您生成汇编文件。然后,您可以查看生成的实际代码,而不必费心去理解段设置和声明数据的所有丑陋细节

例如:

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

     printf("%d\n", c);
 }
一个简单的程序,你知道它应该做什么。查看生成的代码可以让您了解它是如何工作的,您可以继续使用更复杂的东西,即使用指针之类的东西


所涉及的指令并不是那么复杂,不需要对汇编有深入的了解就可以轻松理解。

我同意汇编程序的知识可以帮助您调试c程序。我建议你做两件事。随意混合:-)

首先:获取一本关于x86(IA-32)汇编语言的入门书。有几本好书可供选择,如:

“Linux汇编语言编程指南”

“用于x86处理器的汇编语言”

购买或在图书馆(libgen/bookfi)查阅。我读了《Linux汇编语言编程指南》,这是一个很好的开始。我更愿意回顾一下“x86处理器的汇编语言”。是的,这些书相当大,但它们也有一个很长的介绍,你可能(想)跳过,你不必把书读到最后,只是为了得到一个汇编程序的介绍

第二:编写简单的c程序,用gcc-S将它们编译成汇编程序,然后使用gdb逐步完成它们,并尝试理解它们的功能。如果你不知道一条指令能做什么,谷歌搜索该指令,你会发现大量的教程和注释代码对你有帮助

如果你不能像你所希望的那样快速理解每件事,不要气馁。现在,您已经了解了assembler,是时候升级了(游戏/进入游戏盘/随便什么)。例如,尝试遵循以下帖子(即在brain/machine中运行和调试代码):

这是Aleph One广为认可的“为了乐趣和利润而粉碎堆栈”。您将在本网站上找到许多与本文相关的文物;-)但是要小心:如果你想在家里亲自尝试,请使用gcc-fno堆栈保护器

这不是一篇关于汇编语言的文章,但它正是你问题的关键所在。它使用对汇编程序和其他工具的理解来创建(调试)一段代码,并且非常详细,它将进一步提示您哪些技能对调试有用

现在您将看到,不仅汇编程序的知识是有用的,而且深入理解堆栈和堆机制(以及调试工具,哦!)对于成为一个好的调试器也是必要的


我希望这会让你感觉很好。和往常一样——负责任地进行黑客攻击。

老实说,不会的。也就是说,学习汇编对具体调试C代码几乎没有帮助(除了少数特殊情况,如微控制器/嵌入式系统项目)。如果您已经了解汇编,它会有所帮助,但即使如此,根据我使用C和汇编以及一些真正强大的调试器的经验,以这种方式调试代码似乎效率低下

也就是说,我绝对鼓励任何人探索汇编并尽可能多地了解它,甚至编写一些汇编代码。它将提供关于程序如何在较低级别上工作的其他重要见解。而且,在某些情况下,它甚至可以很有趣

至于调试,Linux和Windows之类的工具应该是调试C代码的第一道防线。我很少专门打开我的汇编文件来追踪C代码中的错误。我经常出于好奇而打开它

如果你对学习一般的组装感兴趣,那么谷歌搜索一下就可以找到大量的材料,还有很多关于这个主题的好书。我在学校使用的一本书(现在仍在使用)是,它没有涵盖太多的汇编,但将从程序员的角度教你关于低级计算的知识。它将解释作为程序员,我们如何在编写代码时考虑低级计算,我认为这是您问题的核心


简而言之:我鼓励任何人探索汇编,但我建议在尝试通过查看汇编调试C代码之前使用其他工具进行调试。

除非您进行嵌入式开发,否则多年来,调试器已经足够好了,您不需要了解汇编程序或CPU寄存器就可以调试程序。然而,了解汇编程序可以帮助您了解计算机在所有库和抽象之下的工作方式,帮助您了解内存布局和指针,并帮助您成为一名更好的C程序员。