我基本上来自C语言编程世界,现在深入研究Ruby和Python等脚本语言世界。
我想知道如何进行调试。 目前我遵循的步骤是,
虽然它有效,但我无法像在VC ++环境中那样进行调试。
我的问题是,有没有更好的调试方法?
注意:我想这可能是一个重复的问题,如果有的话,请指出我的答案。
答案 0 :(得分:10)
你的序列似乎完全倒退了。我是这样做的:
具体来说,我在完成之前执行。到那时为时已晚。
当然有调试器,但是经过良好的测试和良好的设计,我几乎从不需要一个。
答案 1 :(得分:6)
这是使用ruby-debug进行ruby调试的screencast。
答案 2 :(得分:4)
这里的问题似乎是你的环境(Visual Studio)不支持这些语言,而不是这些语言一般不支持调试器。
Perl,Python和Ruby都有功能齐全的调试器;你也可以找到其他帮助你的IDE。对于Ruby,有RubyMine;对于Perl,有Komodo。而这只是我的头脑。
答案 3 :(得分:3)
Python调试器here
有一个很好的温和介绍答案 4 :(得分:2)
如果您正在使用Python,那么您可以找到一个调试工具列表here,我只想将Eclipse添加到Pydev extension,这样可以使用断点等也很简单。
答案 5 :(得分:2)
与其他语言相比,脚本语言没有区别,因为您仍然需要将问题分解为可管理的部分 - 即函数。因此,在完成整个脚本之后,我宁愿在整合它们之前测试这些小函数,而不是测试整个脚本。 TDD总能提供帮助。
答案 6 :(得分:2)
我的问题是,有没有更好的调试方法?“
是
你的方法,“1。我完成了一个大的脚本,2。除了我要检查的部分之外的所有内容,3。执行脚本”并不是用任何语言编写任何软件的最佳方式(抱歉,但是这是事实。)
不要写任何大的东西。如初。
这样做。
将您的问题分解为对象类。
对于每个班级,请按
编写班级2a上。概述类,重点关注外部接口,而不是实现细节。
2B。编写测试以证明界面有效。
2c中。运行测试。他们会失败,因为你只是概述了课程。
2d上。修复课程直到通过考试。
2E。在某些时候,你会发现你的班级设计不是最优的。重构您的设计,确保您的测试仍然通过。
现在,编写最终脚本。它应该很短。所有课程都已经过测试。
3A。概述脚本。实际上,您通常可以编写脚本。
3B。写一些证明脚本有效的测试用例。
3c上。试过测试。他们可能会过去。你已经完成了。
3D。如果测试没有通过,请将问题解决,直到测试为止。
写很多小东西。从长远来看,它可以更好地编写大量内容并对其中的部分内容进行评论。
答案 7 :(得分:1)
这里有很多好建议,我建议你做一些最佳实践:
http://github.com/edgecase/ruby_koans
http://blog.rubybestpractices.com/
http://on-ruby.blogspot.com/2009/01/ruby-best-practices-mini-interview-2.html
(并阅读Greg Brown的书,它很棒)
你谈论大型脚本。我的很多工作流程都是在irb或python shell中编写逻辑,然后将它们捕获到一系列小型,单任务聚焦的方法中,并进行适当的测试(不是100%覆盖,更侧重于边缘和角落情况)。 / p>
http://binstock.blogspot.com/2008/04/perfecting-oos-small-classes-and-short.html
答案 8 :(得分:0)
在Ruby IDE here上有一个问题 - 并且搜索“ruby IDE”提供了更多。
我完成了一个大脚本
这引起了我的注意:“完整”对我而言意味着“完成”,“完成”,“释放”。无论你是否在编写通过它们的函数之前编写测试,或者你是否编写测试(我建议你这样做),你都不应该编写无法运行的代码(这本身就是一个测试) )直到它变大。 Ruby和Python提供了多种编写小型,可单独测试(或可执行)代码片段的方法,因此您无需等待(?)天就能运行该东西。
我正在构建一个(Ruby)数据库转换/转换脚本 - 它大约有1000行,但仍未完成。我没有运行它很少超过5分钟,或者至少运行我正在工作的部分。当它破裂时(我不完美,它会破坏很多;-p)我知道问题必须在哪里 - 在我最近5分钟写的代码中。进展非常快。
我并不认为IDE /调试器没有位置:在发布大量代码之前,有些问题不会出现:有时候将整个内容放到调试环境中以找出它是非常有用的到底是怎么回事。当涉及第三方库和框架时,调试它们的代码来定位问题(通常 - 但不总是 - 与错误理解库函数有关)是非常有用的。
答案 9 :(得分:0)
您可以使用附带的pdb模块调试Python脚本。如果你想要一个可视化调试器,你可以下载winpdb - 不要被那个“win”前缀推迟,winpdb是跨平台的。
答案 10 :(得分:0)
您所描述的调试方法非常适合像C ++这样的静态语言,但鉴于语言是如此不同,编码方法也同样不同。动态语言(如Python或Ruby)中最重要的一点是交互式顶层(通过键入来获得,在命令行中说python
)。这意味着运行程序的一部分非常容易。
即使你在测试之前编写了一个大程序(这是一个坏主意),但希望将它分成许多函数。所以,打开你的交互式顶层,做一个import thing
(对于任何thing
碰巧)然后你可以轻松地开始逐个测试你的函数,只需在顶层调用它们。
当然,对于一个更成熟的项目,您可能想要写出一个实际的测试套件,并且大多数语言都有一个方法(在Python中,这是doctest
和nose
,不懂其他语言)。但是,首先,当你写一些不是特别正式的东西时,只需记住一些调试动态语言的简单规则:
print
陈述也是如此。如果您只运行单个函数,使用print
语句进行调试并不是那么不方便,也可以让您免于在IDE中拖动。