我正在研究用c ++编写的项目,该项目对文本行进行一些操作。其中一行使程序进入函数的无限循环(2000多行代码)。原因是由另一个2000+线功能检查的条件失败。我知道如果我删除原始行中的引号符号一切正常(检查工作正常,没有无限循环)。但是这两个巨大功能的逻辑是不可思议的,编写这些方法的人不再可用。所以,基本上,我剩下的就是一步一步地比较坏线和好线的情况,程序采取的路径。
是否有可以打印执行路径的工具,所以我不必手动比较每一步?掌握巨大未知函数的记录的一般技术是什么?
P.S。使用Windong和Visual Studio
答案 0 :(得分:3)
我参与了一个C ++项目,在一个函数中有超过4000行代码的函数,所以我感到很痛苦!我当时没有选项,但我会做的是将大函数隔离到一个新项目中,这样你就可以在不破坏主代码库的情况下使用它们。
然后我将它单元测试到最大值,传递许多不同的输入,并声明输出是第一次运行时发生的事情。一旦你开心,你已经尽可能多地覆盖,那么就开始重构。选择您理解的一小部分代码,并将其提取到一个命名良好的方法中。好的候选者是具有多个条件的if
语句,循环的内容和代码块以注释开头。确保新功能名称是自我评论的,例如CopyContentsOfStringIntoBuffer()
这有两个方面的帮助 - 首先,您将能够看到您的主要功能变小。其次,您不需要阅读已经理解的代码。第三,代码变得更具可读性。
一旦你完成了你理解的位,你可以为你不理解的代码做类似的事情。将其解压缩为一个新函数,并使用各种输入编写一些单元测试,并查看输出是什么。理解后,重命名该功能以反映您的理解。
继续运行原始单元测试,以确保在重构过程中不会破坏任何内容。
您可以编写更多单元测试来验证新功能。一旦您满意,您可以将代码移回原始项目(使用测试)。你的未来,定期感谢你。
答案 1 :(得分:1)
我会创建一个函数来写入输出窗口或日志文件,并从代码中的不同位置调用它作为参数传递给字符串,您可以在其中指定您在代码中的位置。
查看日志,您将看到循环的位置。这样做几次你应该确定准确的循环位置。
例如:
public void Log(string s) { //将s写入日志文件 }
代码
Log(“在函数x行y”中)//首先将此行放在所有位置,然后通过查看日志输出删除没有问题的地方
答案 2 :(得分:0)
将步骤写入日志文件将是一个很好的方法。