我尝试编写简单的应用程序,每当发生任何错误时,都会尝试调试并了解导致错误的原因。
如标题所述,学习汇编语言如何帮助我调试 C 程序?同样,汇编语言的所有主题都需要什么。
PS:我对掌握汇编语言不感兴趣,但考虑学习相同以更好地理解过程。
PPS:主题的链接会很棒。
谢谢!
老实说,不会。也就是说,学习汇编对帮助您专门调试您的 C 代码几乎没有什么帮助(除了在一些特殊情况下,如微控制器/嵌入式系统项目)。如果您已经了解汇编,它会有所帮助,但即便如此,根据我使用 C 和汇编以及一些非常强大的调试器的经验,在我看来,以这种方式调试代码效率低下。
也就是说,我绝对鼓励任何人探索汇编并尽可能多地学习它,甚至编写一些汇编代码。它将提供有关程序如何在低得多的级别上运行的其他重要见解。而且,在某些情况下,它甚至可以很有趣。
至于调试,像Linux 的gdb和 Windows 的Visual Studio 调试器这样的工具应该是你调试 C 代码时的第一道防线。我很少专门打开我的程序集文件来试图追踪我的 C 代码中的错误。我更多时候是出于好奇打开它。
如果您有兴趣了解一般的汇编知识,那么只需在 Google 上搜索一下就可以找到大量材料,以及有关该主题的各种好书。我在学校使用(并且仍在使用)的一本书是Computer Systems: A Programmer's Perspective,它没有涵盖太多的汇编,但会从程序员的角度教你有关低级计算的知识。它将解释我们作为程序员如何编写考虑到低级计算的代码,我认为这是您问题的核心。
简而言之:我鼓励任何人探索汇编,但我建议在尝试通过查看汇编来调试 C 代码之前使用其他工具进行调试。
掌握汇编知识可以帮助您了解程序内部发生了什么。尤其是缓冲区溢出很难追踪,在最坏的情况下,应用程序会在完全不相关的地方中断,您不知道它是如何到达那里的。如果编译器有错误并且您不知道为什么您的编码没有按照应有的方式进行,这也会有所帮助。
一个简单的方法是编写一个小而简单的 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 逐步执行它们并尝试了解它们的作用。如果您无法弄清楚一条指令会做什么,请在谷歌上搜索该指令,您会发现大量的教程和注释代码会对您有所帮助。
如果您没有按照自己的意愿快速理解所有内容,请不要气馁。现在,您了解了汇编程序,是时候加强(游戏/进入盘子/其他)了。例如,尝试关注(即在大脑/机器中运行和调试代码)这些帖子:
http://www.phrack.org/issues.html?issue=49&id=14#article 这是 Aleph One 广为人知的“为了乐趣和利润而粉碎堆栈”。您会在此站点上找到许多与本文相关的遗物;-) 但请注意:如果您想自己在家尝试,请使用 gcc -fno-stack-protector。
https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free 这不是一篇关于汇编语言的文章,但它是正确的。它使用对汇编程序和其他工具的理解来创建(调试)一段代码,并且非常详细,它将进一步提示您哪些技能对调试有用。
您现在将看到,不仅汇编程序知识很有用,而且对堆栈和堆机制(以及调试工具,d'oh!)的更深入理解对于成为一名优秀的调试器也是必要的。
我希望这能找到你。和往常一样——负责任地破解。
我不确定您到底想要什么。但是下面的链接可能对您有用