6

我基本上来自 C 语言编程世界,现在钻研 Ruby 和 Python 等脚本语言的世界。

我想知道如何进行调试。目前我遵循的步骤是,

  • 我完成了一个大剧本,
  • 评论除我要检查的部分之外的所有内容
  • 执行脚本

虽然它有效,但我无法像在 VC++ 环境或类似环境中那样进行调试。

我的问题是,有没有更好的调试方法?

注意:我想这可能是一个重复的问题,如果是这样,请指出答案。

4

11 回答 11

10

你的顺序在我看来完全倒退了。这是我的做法:

  1. 我为我想要的功能编写了一个测试。
  2. 我开始编写脚本、执行位和验证测试结果。
  3. 我回顾了我为记录和发布所做的工作。

具体来说,我在完成之前执行。到那时已经太晚了。

当然也有调试器,但有了好的测试和好的设计,我几乎从不需要调试器。

于 2009-10-07T07:09:05.897 回答
6

这是使用 ruby​​-debug进行 ruby​​ 调试的截屏视频。

于 2009-10-07T06:47:48.343 回答
4

似乎这里的问题是您的环境(Visual Studio)不支持这些语言,而不是这些语言通常不支持调试器。

Perl、Python 和 Ruby 都有功能齐全的调试器;您也可以找到其他对您有帮助的 IDE。对于 Ruby,有RubyMine;对于 Perl,有Komodo。这只是我的想法。

于 2009-10-07T06:47:28.000 回答
3

这里有一个很好的 Python 调试器介绍

于 2009-10-07T06:56:44.007 回答
2

如果您正在使用 Python,那么您可以在此处找到调试工具列表,我只想将带有Pydev 扩展的Eclipse添加到其中,这使得使用断点等也非常简单。

于 2009-10-07T06:49:50.320 回答
2

脚本语言与其他语言相比没有区别,因为您仍然必须将问题分解为可管理的部分——即函数。因此,与其在完成整个脚本后测试整个脚本,我更愿意在集成之前测试那些小功能。TDD 总是有帮助的。

于 2009-10-07T06:50:14.833 回答
2

我的问题是,有没有更好的调试方法?”

是的。

你的方法,“1.我完成了一个大脚本,2.评论除了我想要检查的部分之外的所有内容,3.执行脚本”并不是用任何语言编写任何软件的最佳方式(对不起,但这是事实.)

不要写大的东西。曾经。

做这个。

  1. 将您的问题分解为对象类。

  2. 对于每个类,将类写为

    2a. 概述类,关注外部接口,而不是实现细节。

    2b。编写测试以证明接口有效。

    2c。运行测试。他们会失败,因为您只概述了课程。

    2d。修复类,直到它通过测试。

    2e。在某些时候,你会意识到你的类设计不是最优的。重构您的设计,确保您的测试仍然通过。

  3. 现在,编写您的最终脚本。它应该很短。所有的类都已经过测试。

    3a。概述脚本。实际上,您通常可以编写脚本。

    3b。编写一些测试用例来证明脚本有效。

    3c。运行测试。他们可能会通过。你完成了。

    3d。如果测试没有通过,请修复问题,直到它们通过。

写很多小事。从长远来看,写一个大的东西并评论它的一部分会更好。

于 2009-10-07T10:20:23.857 回答
0

您描述的调试方法非常适合像 C++ 这样的静态语言,但鉴于语言如此不同,编码方法也同样不同。在 Python 或 Ruby 等动态语言中,最重要的事情之一就是交互式顶层(你可以通过键入来获得,比如python在命令行上)。这意味着运行程序的一部分非常容易。

即使您在测试之前编写了一个大型程序(这是一个坏主意),也希望它被分成许多功能。所以,打开你的交互式顶层,做一个import thing(不管thing发生什么),然后你就可以轻松地开始一个一个地测试你的函数,只需在顶层调用它们。

当然,对于一个比较成熟的项目,你可能想要写出一个实际的测试套件,而大多数语言都有方法可以做到这一点(在 Python 中,这是doctestand nose,不知道其他语言)。不过,起初,当你写一些不是特别正式的东西时,只要记住一些调试动态语言的简单规则:

  • 从小处着手。不要编写大型程序并对其进行测试。在编写每个函数时对其进行测试,至少要粗略地测试一下。
  • 使用顶层。用 Python 这样的语言运行小段代码非常轻量级:启动顶层并运行它。与编写一个完整的程序并在 C++ 中编译运行它相比。利用这一事实,您可以快速更改任何函数的正确性。
  • 调试器很方便。但通常,print陈述也是如此。如果您只运行一个函数,那么使用print语句进行调试并不是那么不方便,而且还可以让您免于在 IDE 中拖拖拉拉。
于 2009-10-07T11:43:16.753 回答
0

这里有一个关于 Ruby IDE 的问题-搜索“ruby IDE”可以提供更多信息。

我完成了一个大脚本

这就是引起我注意的地方:对我来说,“完成”意味着“完成”、“完成”、“发布”。无论您是否在编写通过测试的函数之前编写测试,或者您是否完全编写测试(我建议您这样做),您都不应该编写无法运行的代码(这本身就是一个测试) 直到它变大。Ruby 和 Python 提供了多种方法来编写小的、可单独测试(或可执行)的代码片段,这样您就不必等待(?)天才能运行它。

我现在正在构建一个(Ruby)数据库翻译/转换脚本——它最多有 1000 行,但还没有完成。我很少运行超过 5 分钟而不运行它,或者至少运行我正在处理的部分。当它坏了(我并不完美,它坏了很多;-p)我知道问题出在哪里 - 在我在最后 5 分钟编写的代码中。进展相当快。

我并不是说 IDE/调试器没有位置:在发布大量代码之前,一些问题不会浮出水面:有时将整个东西放到调试环境中以找出发生了什么真的很有用上。当涉及第三方库和框架时,调试他们的代码以定位问题(通常 - 但不总是 - 与对库函数的错误理解有关)非常有用。

于 2009-10-07T08:38:02.327 回答
0

这里有很多很好的建议,我建议您通过一些最佳实践:

http://github.com/edgecase/ruby_koans

http://blog.rubybestpractices.com/

http://on-ruby.blogspot.com/2009/01/ruby-best-practices-mini-interview-2.html

(并阅读格雷格布朗的书,非常棒)


您谈论大型脚本。我的很多工作流程是在 irb 或 python shell 中处理逻辑,然后将它们捕获到一系列小型、单任务集中方法中,并进行适当的测试(不是 100% 的覆盖率,更多地关注边缘和极端情况)。

http://binstock.blogspot.com/2008/04/perfecting-oos-small-classes-and-short.html

于 2009-10-07T18:47:44.683 回答
0

您可以使用包含的 pdb 模块调试您的 Python 脚本。如果你想要一个可视化调试器,你可以下载winpdb——不要被那个“win”前缀吓到,winpdb 是跨平台的。

于 2009-10-07T09:39:48.460 回答