为什么不教导学生使用调试器?

时间:2009-12-21 21:49:00

标签: debugging

这里有很多的家庭作业问题。

我猜想通过调试器中的代码并观察程序/变量状态可以解决90%以上的问题。

我从未被教过使用调试器。我只是打印并阅读了GDB手册并逐步完成了他们的示例。当我第一次使用Visual Studio时,我记得想,哇!这可以多么简单,单击设置断点,鼠标悬停在变量上的值,按键步骤,立即窗口,debug.print等...

无论如何,学生是否“被教导”使用调试器?如果没有,为什么不呢? (或许更好的问题是,为什么他们不能学会自己使用调试器......也许他们需要告诉有这样的工具可以帮助他们......)

学习使用调试器需要多长时间?

19 个答案:

答案 0 :(得分:27)

我不认为问题在于教学。使用现代图形调试器并不是火箭科学(至少不适用于在单台计算机上运行的大多数用户模式程序)。问题在于一些人的态度。为了有效地使用调试器,您应该:

  • 承认it's your faultselect isn't broken
  • 坚持不懈地花几个晚上调试,不要忘记前一点。
  • 没有具体的算法可供遵循。你应该从所看到的内容中进行有根据的教育和有效推理。

没有多少非程序员有这些态度。在大学期间,我见过许多朋友在相对​​较短的时间内放弃并给我带来一些代码并告诉我计算机出错了。我经常告诉他们我比他们更信任他们的电脑(这会伤害一些感情,但就是这样)。

答案 1 :(得分:7)

在我的高中和大学里,班上的大多数人根本不关心编程。

答案 2 :(得分:5)

如果我没记错的话,在我的第二年Intro to C课程中介绍了调试器。当然,大多数学生在这一点上都在努力解决的问题是让他们的工作进行编译,这是调试人员无法帮助的。一旦他们的十行命令行程序编译然后崩溃,那么他们已经有了一些printfs。争取掌握GDB是过度的。

根据我的经验,实际上处理一个足够大的代码库是非常罕见的,而不仅仅是粗略地熟悉一个调试器,值得在大多数Comp中投入时间。科学课程。程序很小,你遇到的问题更多的是找出算法的时空复杂性。

调试器在现实世界的项目中变得更有价值,在不同的时间你有很多代码由不同的人编写,以便在调用bar()之前找出保持froo foo的内容。

答案 3 :(得分:5)

如果学生是指计算机科学专业的学生,​​我认为答案是相当明显的。课程的主题通常是理论,其中有编程语言/框架/库作为辅助。教授不能在一个特定的工具上走得很远,因为这会花费他教授网络或系统或其他什么的时间。也许如果有一个名为“真实世界编程”的课程或类似的课程,他们会覆盖调试器,但总的来说,我并不认为期望学生阅读语言/工具文档以完成课程作业有太多错误

答案 4 :(得分:4)

这是向你学校的教师提出的一个很好的问题。

在我的大学,他们给出了一个非常简短的调试示例,然后向我们指出了“帮助”文件和书籍。

也许他们不会教它,因为有很多东西可以覆盖,所以讲课的时间也很少。教授们不会抓住每个人的手。

答案 5 :(得分:4)

并非完全相关,但人们需要使用调试器,不仅仅是为了调试,而是为了理解工作代码。

答案 6 :(得分:3)

我会在另一边加注警示。我学会了使用Visual Basic和Visual C(80年代中期)进行编程,调试器内置且易于使用。太容易了,事实上......我一般都没有考虑如何解决问题,我只是在调试器中运行并调整了行为。哦,那个变量太高了......我必须在这里减去一个!

直到我切换到Linux,用不那么容易的gcc / gdb组合,我开始欣赏设计并首先考虑你的代码。

我承认,我现在可能走得太远了。我使用调试器来分析堆栈跟踪,这就是它。在分析问题和在调试器中逐步执行问题之间应该存在中间立场。当然,人们也应该看到所有可用的工具。

答案 7 :(得分:2)

我被教导在大学里使用调试器。不多,迟到(这应该是教学的第二件事),但他们教会了我。

无论如何,向DEBUG教授,不仅要“使用调试器”,这一点很重要。在某些情况下,您无法使用gdb进行调试(例如,尝试调试运行10个并发线程的程序),并且您需要一种不同的方法,例如老式的printf。 我当然同意你的意见,通常一个人在第一次使用它们时学习并使用调试技术。

答案 8 :(得分:2)

从实用角度来看,很可能(由于策略或技术限制)您无法在生产应用程序上使用调试器。不使用调试器,因为过多的拐杖会促使向应用程序添加适当的日志记录。

答案 9 :(得分:2)

因为没有关于调试的教科书,期间。

事实上,很难创造一种教学情境,即获得使用债券的动机。典型的分配太简单了,真的需要调试器。 Greg Wilson在去年的SUITE研讨会上提出了这个话题,并且一致认为让学生使用调试器非常困难。您可以告诉他们有关调试的信息,但是创建他们真正感觉到使用调试器的痛苦的情况很难。

也许关于游戏破解的讲座可能会促使学生用调试器逐步完成游戏?至少,这就是为什么我告诉自己如何使用调试器作为一个12岁的人:)

答案 10 :(得分:1)

发现学术界和经验丰富的系统程序员对调试器存在很多负面态度。我遇到了一位非常有才华的程序员,他声称“调试器不起作用,我只使用日志文件”。很公道,对于多线程服务器应用程序,您必须具有日志记录,但不可否认,调试器对99%的非线程代码非常有用。

在回答您的问题时,调试程序应该包含在编程大纲中,但作为调试程序的工具之一。跟踪和记录也很重要。

答案 11 :(得分:1)

在4所大学(伦斯勒,普渡大学,俄亥俄州立大学,华盛顿大学)招聘 - 为与大学相关的孵化器编写代码的学生倾向于学习调试的艺术,因为孵化公司希望人们解决问题,并在更短的时间内完成,并花一些时间教他们使用良好的调试技术。根据特定孵化器公司的复杂程度,他们可能会投资于指导模式和绩效,以帮助学生提高工作效率,但通常调试是第一项投资。

留给传统的cs课程,学生似乎没有使用相同的技能来帮助他们缩小问题,在程序/服务/页面/网站/组件运行时操纵数据并且真正理解他们写的东西与他们需要写的东西的含义是什么。

我去了伦斯勒,我自己学习了'因为我为某些项目支付了固定费用,我想减少自己花在编程上的时间 - 而且我在1994年作为一名实习生@Microsoft进一步加强了看看集成开发环境到底有多么有用。

答案 12 :(得分:1)

基于我作为TA和有抱负的CS教授的经验来假设一个假设:

这实际上会让那些几乎没有编程经验的孩子感到困惑,而不是那些帮助(在这里和我一起露面......)

现在首先:我完全同意教授如何使用调试器将是一件好事,但我认为这样做的障碍源于软件工程和计算机科学不是单独的专业的更大,更系统的问题。大多数CS程序将需要2-4个课程,其中学习代码是重点。在这之后,编码能力是必需的,但不是课程的主题。

对于我的要点:使用“你现在没有得到这个但是因为它以后会有用”的幌子来教授一些东西是非常困难的。你可以尝试,但我不认为它真的有效。这是人们真正从中学习的想法的延伸。通过动议但不理解为什么与做不一样。

我认为孩子们第一次学习编码并不会理解为什么使用调试器比插入打印行更有效。考虑一下您编写的中小型脚本:您是否会使用调试器来禁止奇怪的行为或某些您无法快速解决的错误?我不会,似乎只会让我慢下来。但是,当涉及到维护我每天工作的庞大项目时,调试器毫无疑问是非常宝贵的。当学生到达需要大项目的课程部分时,他们不再是专注于一般编码的课程。

所有这一切都让我想到了一个很棒的想法,我认为每个CS教授在教授如何编写代码时都应该这样做:而不是专门向孩子们询问项目,不时给他们一大堆复杂的代码并询问他们来修复错误。这将教会他们如何使用调试器

答案 13 :(得分:0)

我在第一个CS课程中教过如何使用调试器。当我编写的大部分内容都是“Hello World!”时,设置断点并单步执行代码对我没什么好处。从那时起我几乎忽略了调试器,直到我学习在更高级的课程中使用GDB,同时处理“二元炸弹”作业。

由于我已经失学并且正在工作,我花了很多时间使用调试器并学习它有多么有用。我会说学习使用调试器包括三件事 - 一件需要,一门学习/学习如何使用一件,以及体验如何使用一台优势。

另外,在调试器不可用/不必要的情况下,花一些时间学习“echo debugging”是值得的。那只是我的0.02美元。

答案 14 :(得分:0)

在高中时,我们被教导通过将东西写入控制台进行调试。

在大学里,我们学习了混合使用调试器。

这些工具只是更容易使用,所以我真的不确定为什么没有教它。

答案 15 :(得分:0)

在我看来,这里有很多问题。这里有一些被问及我推断的一些:

我最初是在BASIC和Pascal中教过的,通常使用一个解释器,这样可以更轻松地运行程序直到爆炸。我们没有断点或许多现在用于跟踪代码的花哨的东西,尽管这可能是1983年至1994年在Mac上使用Commodore 64,Watcom BASIC和Pascal。

即使在我大学的后期,我们也没有调试器。如果我们的代码不起作用,那么就1995-1997的时间而言,我们有印刷声明或手工追踪。

一个带有调试器的cavaet就像Visual Studio这样的东西,你知道它需要花多长时间来完成调试的每个功能吗?在某些情况下,我认为可能需要数年时间。这没有涉及到最终可能使用的所有构建选项和其他可以做的事情。另一点是,对于调试器给出的所有好东西,可以说一些复杂的东西可以得到,例如。在VS中使用断点有调用堆栈,局部变量,监视窗口,内存,反汇编以及在执行停止时可能要检查的其他内容。

我认为,使用调试器的基础知识可以在一周左右的时间内学习。然而,为了掌握调试器的功能,在代码执行时以及在执行代码的情况下会发生多少事情,因为现在有很多地方可以像GPU一样运行CPU,花更长的时间,我会质疑有多少人有这样的动力,即使在学校也是如此。

答案 16 :(得分:0)

你的问题有点像,“为什么学生不教软件测试”?我肯定在某些地方这样做,但通常大学/学院坚持教授“有趣的”理论计算机科学的东西,而不倾向于教授实用工具。就像你在学校学习英语一样,他们会教你如何写作,而不是如何使用MS Word(是的,我确定有一些Word课程,但你明白我的观点)。

答案 17 :(得分:0)

我没有被教过在我的本科学位中使用调试器,因为你不能在一副穿孔卡上使用调试器。如果你在“工作”等15分钟的转变,即使是印刷报表也是一种奢侈。

我不是说不应该教人们使用调试器。只是在没有这种帮助的情况下学习调试也很重要,因为:

  1. 如果您不必依赖调试器,它将帮助您更好地理解您的代码,
  2. 有些情况下无法使用复杂的调试器。
  3. 关于后一点,我还记得使用(相当昂贵的)逻辑分析仪在嵌入式设备上调试启动prom来捕获地址/数据线上发生的事情。

答案 18 :(得分:0)

同样的原因,学生不会学习版本控制,单元测试,shell脚本,文本编辑,文档编写,甚至(超出介绍课程)编程语言。该课程涉及计算机科学,通常是一个概念或一系列概念,而不是编程。你应该学习你需要的东西。

这并非计算机科学所独有。我的化学课程(我也有化学学位)也没教我如何使用任何化学实验室设备。你了解到,在实验室闲逛,看着其他学生,并询问那些挂在那里的头发花白的老教授。