【问题标题】:How can learning assembly language help me in Debugging C programs?学习汇编语言对调试 C 程序有何帮助?
【发布时间】:2013-05-07 09:59:39
【问题描述】:

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

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

PS:我对掌握汇编语言不感兴趣,但考虑学习同样的语言以更好地理解过程。

PPS:主题的链接会很棒。

谢谢!

【问题讨论】:

  • 除非您从事嵌入式开发,否则多年来调试器已经足够好,您不必了解汇编程序或 CPU 寄存器就可以调试程序。但是,了解汇编程序可能会帮助您了解计算机在所有库和抽象下的工作原理,帮助您了解内存布局和指针,并帮助您成为更好的 C 程序员。

标签: c debugging assembly gdb


【解决方案1】:

老实说,不会。也就是说,学习汇编对帮助您专门调试您的 C 代码几乎没有什么帮助(除了在一些特殊情况下,如微控制器/嵌入式系统项目)。如果您已经知道汇编,它会有所帮助,但即便如此,根据我使用 C 和汇编以及一些非常强大的调试器的经验,在我看来,以这种方式调试代码效率低下。

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

至于调试,在调试 C 代码时,像用于 Linux 的 gdb 和用于 Windows 的 visual studio debugger 这样的工具应该是您的第一道防线。我很少专门打开我的程序集文件来试图追踪我的 C 代码中的错误。我更多时候是出于好奇才打开它。

如果您有兴趣了解有关汇编的一般知识,只需短暂的 Google 搜索即可获得大量资料,以及有关该主题的各种好书。我在学校用过(现在还在用)的一本书是Computer Systems: A Programmer's Perspective,它没有涉及太多汇编,但会从程序员的角度教你低级计算。它将解释我们作为程序员如何编写考虑到低级计算的代码,我认为这是您问题的核心。

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

【讨论】:

    【解决方案2】:

    了解汇编有助于您了解程序内部发生的情况。尤其是缓冲区溢出很难追踪,在最坏的情况下,应用程序会在完全不相关的地方中断,您不知道它是如何到达那里的。如果编译器有错误并且您不知道为什么您的编码没有按照应有的方式进行,这也会有所帮助。

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

    例如:

     main()
     {
         int a = 3,
         int b = 5;
         int c = 0;
         c = a+b;
    
         printf("%d\n", c);
     }
    

    一个简单的程序,你就知道它应该做什么。查看生成的代码可以让您了解它的工作原理,并且您可以继续处理更复杂的内容,即使用指针等。

    所涉及的指令并不复杂,无需深入的汇编知识即可轻松理解。

    【讨论】:

      【解决方案3】:

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

      http://cs.smith.edu/~thiebaut/ArtOfAssembly/artofasm.html

      【讨论】:

        【解决方案4】:

        我同意汇编程序的知识可以帮助您调试 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!)的更深入了解对于成为一名优秀的调试器也是必要的。

        我希望这对你有好处。和往常一样 --- 负责任地破解。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-15
          • 1970-01-01
          • 2011-10-01
          • 1970-01-01
          • 2013-09-16
          • 2012-08-23
          相关资源
          最近更新 更多