【问题标题】:How to reverse engineer a program which has no documentation [closed]如何对没有文档的程序进行逆向工程[关闭]
【发布时间】:2009-09-09 04:47:12
【问题描述】:

我有一个没有任何文档或 cmets 的 python 程序源。 我确实尝试过两次来理解它,但大多数时候我都迷失了方向,因为有很多文件。 应该采取哪些步骤来全面快速地理解该程序。

【问题讨论】:

  • 这是一个很常见的问题..

标签: python open-source


【解决方案1】:

Michael Feathers' "Working Effectively with Legacy Code" 是此类努力的绝佳起点——不是特别依赖于语言(他的示例使用几种非 Python 语言,但技术和思维方式确实很好地扩展到 Python 和几乎任何其他语言)。

重点是,您想要了解代码出于某种原因 -- 修改和/或移植它。因此,使用电池和测试支架以及跟踪/日志记录来检测遗留代码是安全和负责任地理解和修改的漫长而艰难的过程中的关键路径。

Feathers 建议了启发式方法和技术,用于在代码完全混乱时(因此“遗留”) - 没有文档或 误导 文档(描述一些相当与代码实际所做的不同,也许以微妙的方式),没有测试,一个不可测试的没有重构的意大利面条依赖关系。这似乎是一个极端的例子,但任何在编程领域度过了漫长职业生涯的人都知道它实际上比任何人想要的都要普遍;-)。

【讨论】:

  • +1 我想知道说“去阅读有效地使用旧代码”获得了多少代表点?
【解决方案2】:
  • 过去我使用'Python call graph' 来了解源结构
  • 使用调试器,例如pdb 唤醒 代码。
  • 一天后再次尝试读取代码 打破,这也有帮助

【讨论】:

    【解决方案3】:

    我建议使用 epydoc http://epydoc.sourceforge.net/ 生成一些文档。当然,如果不存在 docstring,结果会很差,但它会给您至少一个应用程序视图,您将能够更轻松地在类中导航。

    然后,当您了解新内容时,您可以尝试自己记录,然后再次重新生成文档。什么时候开始都不晚。

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      你很幸运,它是用 Python 编写的,易于阅读。但是当然也可以用 Python 编写复杂难懂的代码。

      步骤如下:

      1. 运行该软件并学习使用它,并至少了解它的功能。
      2. 通读测试,如果有的话。
      3. 通读代码。
      4. 当您遇到不理解的代码时,请在此处设置调试中断,然后单步调试代码,看看它的作用。
      5. 如果没有任何测试,或者测试覆盖率很低,请编写测试以增加测试覆盖率。这是学习系统的好方法。
      6. 重复直到您觉得您对代码有一个模糊的把握。如果你要管理代码,你只需要一个模糊的抓地力。一旦你开始实际使用代码,你就会很好地掌握。对于一个可能需要数年时间的大型系统,因此不要试图先了解所有内容。

      有一些工具可以帮助您。正如 Stephen C 所说,IDE 是个好主意。我会解释原因:

      许多编辑器分析代码。这通常可以让您完成代码,但更重要的是,在这种情况下,只需按住 ctrl 键单击变量即可查看它的来源。当您想了解其他人的代码时,这确实可以加快速度。

      另外,您需要学习调试器。在代码的棘手部分,您必须在调试器中逐步检查它们以查看代码实际执行的操作。 Python 的 pdb 可以工作,但许多 IDE 都集成了调试器,这使得调试更容易。

      就是这样。祝你好运。

      【讨论】:

        【解决方案5】:

        在我的工作中,我不得不做很多这样的事情。对我有用的可能与对你有用的不同,但我会分享我的经验。

        我首先尝试识别正在使用的数据结构并绘制图表来显示它们之间的关系。不一定是像 UML 这样正式的东西,而是理解的纸上草图,它可以让你看到程序正在操作的数据的整体结构。只有当我对正在使用的数据结构有了一些了解后,我才会开始尝试了解如何数据是被操纵的。

        其次,对于大量的软件,有时您一开始只需要攻击小块。你不会马上得到一个整体的理解,但是如果你详细理解小部分并且不断地切入,最终所有的部分都会融合在一起。

        我将这两种方法结合起来,当我过度沮丧或无聊时在它们之间切换。建议定期在街区周围散步 :) 我发现这最终会给我带来很好的结果。

        祝你好运!

        【讨论】:

          【解决方案6】:

          来自 Logilab 的 pyreverse 和来自 Andy Bulka 的 PyNSource 对 UML 图的生成也很有帮助。

          【讨论】:

            【解决方案7】:

            我会从一个好的 python IDE 开始。查看this question 的答案。

            【讨论】:

              【解决方案8】:

              Sparx Systems 的Enterprise Architect 非常擅长处理源目录和生成类图。它不是免费的,但价格非常合理。 (我与这家公司没有任何关系,几年来我一直是他们产品的满意用户。)

              【讨论】:

                猜你喜欢
                • 2011-04-29
                • 1970-01-01
                • 2021-09-09
                • 2011-08-11
                • 1970-01-01
                • 2011-11-19
                • 1970-01-01
                • 1970-01-01
                • 2016-04-01
                相关资源
                最近更新 更多