没有IDE,如何调试?[关闭]


61

每当我寻找一个IDE时(目前我正在修补Go),我都会发现很多人在推荐Vi,Emacs,Notepad ++等。

我从未在IDE之外进行任何开发;我想我已经被宠坏了。在没有IDE的情况下如何调试?您是否仅限于记录?


53
据我所知,Oldschool printf样式调试:-)
Andrew Walters

25
在IDE出现之前的日子里,我们使用了调试器,这些调试器要么附加到正在运行的进程,要么包装该进程,以允许对程序状态进行步进或自省。(gdb,perl -d等)。将调试器集成到IDE中很方便,但它们确实分开存在。调试器失败,日志记录...只要确保日志记录不会改变程序的状态(重新取回程序时),然后重新引入您要查找的错误。

7
命令行调试器,(几个IDE调试器都基于它们)
棘手怪胎

14
慢慢而仔细。
FrustratedWithFormsDesigner

3
尽管打印非常普遍,但它的使用可以隐藏一些更微妙的错误,例如比赛条件。
詹姆斯

Answers:


86

通过使用调试器。在大多数情况下,这也是IDE幕后的工作-它只是将体验包装在GUI中。

在Unix上,最常用的调试器之一是GNU gdb,它已在很大程度上取代了早期的Unix调试器dbx

要从命令行了解调试的外观/感觉,可以查看gdb手册

与在其他领域一样,从命令行使用调试器需要学习语法和一组命令,但具有很多灵活性和脚本性。另一方面,如果您已经习惯使用vim或emacs这样的编辑器,则可能会发现您喜欢的编辑器中有您喜欢的调试器的插件。


18
为“通过使用调试器” +1。IDE中的I代表“集成的” :)
joshin4colours 2013年

1
如果您使用Python编写,pdb实际上比我发现的任何IDE调试器都要好。
asthasr

1
@syrion并且ipdb比那更好;)
伊兹卡塔

太好了-我不知道它的存在,伊兹卡塔。谢谢。
asthasr

@ joshin4colours集成了!=收藏,不是吗?
科尔·约翰逊

35

在编写图形驱动程序时,我使用调试器已经有好几年了。我有一台第二台计算机,它针对第一台计算机运行调试器(因为当图形驱动程序损坏时,主计算机中的屏幕将无法工作)。能够停止代码并跳到我挂上硬件的位置至关重要,这样我才能知道发生了什么。

对于纯软件问题,我发现思考问题并测试系统以了解更多有关该问题的知识比单步执行代码要有用得多。使用print语句,我可以查看在命令行或日志文件中发生的所有事情的列表,我可以查看并重构发生的事情,与调试器相比,前进和后退更容易。

通常,最棘手的错误可以通过从计算机以外的地方了解问题来解决。有时用一张纸或白板,有时我在做其他事情时答案就会显示出来。最棘手的错误可以通过仔细查看代码(例如在哪里玩Waldo)来解决。使用print语句或logging语句,所有其他似乎最简单的方法。

不同的人有不同的风格,不同的风格更适合不同的任务。打印语句不必一定要离开调试器。根据您的工作,它们甚至可以变得更好。尤其是在没有本地调试器的语言中(Go吗?)。


7
这个。绝对是这样 我发现,至少对我来说,问题往往是逻辑错误或交互作用,而调试器不会更明显。您必须了解为什么出了问题,而不仅仅是什么
假名称

2
完全为+1 going backwards。我经常有丰富的经验:“嘿- waittaminute,这是不正确的值是怎么成为这个?”,并有去来回的输出,同时读取的代码。调试器不擅长向后。
Izkata

是的,gdb非常适合检查转储的内核,但是在这种情况下,我发现免费使用print语句确实有帮助。
布莱恩

调试器有用但短暂。使用良好的日志记录框架,我发现可以建立调试会话。使用调试器可以帮助您了解情况,并配合打印语句使调试会话永久化。我发现随着时间的流逝,我对调试器的起诉越来越少,并且变得越来越有效率
Newtopian 2013年

是的,用纸或白板思考,或者只是在您的脑海中思考是调试的最佳方法。它通常会纠正您的思考过程。有时,调试器是一种简单的解决方法,它可能无法解决程序中为什么会出现错误的原始问题:)
Nishant,2016年

11

有些人在命令行上使用gdb插件。gdb也有独立的GUI前端,例如DDD。根据您的语言,有特定于语言的独立调试器GUI,例如适用于python的Winpdb适用于Java的jswat。由于这些项目专注于调试,因此它们通常优于集成调试器。

关于IDE的另一个肮脏的小秘密是,所有这些东西都值得您花钱,让您指定自定义编辑器,因此您可以将IDE的一部分用于某些任务,但可以使用不错的编辑器进行编辑。仅启动IDE以使用其调试器的情况并不少见,特别是在您的同事都使用的情况下。


1
+1当然,另一种选择是在IDE的编辑器上设置颜色方案和
按键绑定

1
@ darvids0n,我使用IDE已有20多年了,我有一个找到的编辑器,甚至开始暗示可能在某天暗示着下个世纪某个时候开始尝试尝试向GNU Emacs致敬。
John R. Strohm 2013年

6

某些语言提供了REPL-也就是说,您可以在编写代码时逐行编写和执行代码,这可以是验证一段代码的第一步。其中许多还提供调试功能。用于Haskell的GHC随附有GHCi,可用于在命令行中交互式调试程序,类似于IDE的操作方式。


2

我不明白为什么不喜欢使用printf语句进行调试。曾经有一段时间,重新编译和链接程序花费的时间太长,但是今天只需要几秒钟。我发现使用cout,printf,qDebug()等类型的输出进行调试非常容易。Printf语句为您提供了程序执行所有操作的运行历史记录,您可以在事后进行分析,而在调试器中运行将使您不得不手动记住程序运行时的流程。使用printf,您可以将变量的值转换为特定单位,以十六进制,十进制等形式显示。printf语句可以列出例程和变量的名称,以及行号。您只能根据其他变量列出某些数组元素。您可以遵循间接方式。您可以非常轻松地控制输出,放入计数器,仅循环打印某些时间,在调试时添加和删除打印语句,具有不同级别的调试输出,写入文件等。要查看将程序的历史记录写入文件要容易得多。尝试记住您手动执行的所有操作,并可能不得不记下变量随时间变化的内容,以发现程序所做的事情。最后,使用printf语句,您可以将它们永久保留,以将其打开和关闭,以供将来调试。与试图记住手动记录的所有位置相比,查看程序写入文件的历史要容易得多,并且可能不得不记下变量随时间变化的内容,以便发现程序的内容。已经完成了。最后,使用printf语句,您可以将它们永久保留,以将其打开和关闭,以供将来调试。与试图记住手动记录的所有位置相比,查看程序写入文件的历史要容易得多,并且可能不得不记下变量随时间变化的内容,以便发现程序的内容。已经完成了。最后,使用printf语句,您可以将它们永久保留,以将其打开和关闭,以供将来调试。


3
“曾经有一段时间重新编译和链接程序花了太长时间,但是今天只需要几秒钟。” 取决于您的语言和项目的大小。如果我在当前项目中更改头文件,则需要大约65分钟的时间才能在具有256GB RAM的32 CPU的计算机上重建(我不是在开玩笑)
Nemanja Trifunovic

人们没有使用打印语句进行调试的“厌恶感”,他们只喜欢调试器。我知道从未使用过调试器的“ printf人员”比从未使用过printfs的“调试人员”更多。
Karl Bielefeldt

1
对于足够分散的系统,很难使用调试器,但是(由于时钟同步问题而有些不精确)可以关联日志。如果您的软件系统是由在100台不同计算机上运行的二进制文件组成的,则日志/“ printf调试”可能比使用调试器并尝试将所有内容保持在足够的锁定步长(而不会引入其他问题)要容易。
瓦汀

2

jimwise很好地回答了这个问题,但是我想我应该补充一点,如果您选择在没有完整IDE的情况下工作,则Microsoft为Windows提供的命令行调试器称为CDB。当您下载Windows SDK时,CDB附带了其他一些工具,包括与GUI等效的WinDBG


4
您能详细解释一下如何回答所提问题吗?
蚊蚋

您是对的,仅靠它本身并不能回答问题。我觉得@jimwise的答案是该问题的很好答案,但没有提供有关在何处找到Windows命令行调试器的任何信息。因此,我想为遇到这种情况的人提供一个额外的答案,并且想知道如何在Windows上做到这一点。我将回答更多。
德鲁·马什

2

我通常不使用调试器,也许每两周一次,但这不是我要做的第一件事。

我工作中最重要的工具无处不在,以至于我几乎忘了提及它-堆栈跟踪。通过检查堆栈跟踪,可以解决90%以上的问题。根据您的语言,该工具并不总是很有帮助,但是如果使用一种语言将它们很好地实现,则可以节省大量时间。

我猜我发现简单问题的第二种最常见的方式是,可能是我刚刚更改的代码。我经常进行单元测试,所以我通常知道自己刚刚遇到的问题。

对于更复杂的开发和调试,我可能会添加一些调试或跟踪级别的日志语句。我认为开发问题是一个很好的指南,可以帮助我放置生产跟踪/调试日志记录信息,从而使我能够:

您并非总能方便地使用调试器。在生产中,可能无法运行调试器(哎呀,根据公司的安全程度,除日志外,可能无法访问生产计算机)。在某些语言中,连接调试器的时间太长,或者可能没有好的调试器。

如果您一直都在使用逻辑和调试/跟踪级别的日志记录进行编码,那么可能只是检查出色的日志语句(可能会增加日志级别)以找出问题而无需访问硬件的情况。

尽管我认为调试器是一个强大的工具,但不要让它们成为工具箱中唯一的工具!


1

没有理由不能在IDE中与独立文本编辑器一起使用调试器。我曾经使用!Zap进行编辑,使用JBuilder在另一台计算机上进行调试,以及使用地下室中的文件服务器。传统上,调试器是独立的程序,无需拖动IDE,它也可以工作。

值得注意的是,综合测试取代了调试。值得考虑的是,报告的错误是测试中的错误,而不是代码中的错误。

也有printf。创建大量的“日志记录”并在其中进行搜索可能很有用,而不是停止每一行。如果您可以修改生产中无法修改的库类,例如-Xbootclasspath/p:用于入侵Java库类,那么我发现这特别有用。


“值得注意的是,综合测试取代了调试。” -我会说减少而不是“取代”。在某些情况下,即使在执行TDD时,通过调试器运行代码也是有好处的-例如,当测试提供了完全出乎意料的结果时,准确找出出错的地方可能会非常有用-除非它很小刚刚编写的代码,这意味着您在先前的测试中错过了一个极端的案例,但是确实发生了……
Jules

1

同意最好的问题可以用笔和纸从计算机上解决,也可以只考虑问题。这比使用实时调试器更有帮助。它通常会纠正您的思考过程。

您可以使用pudb,这是基于简单用户界面的控制台。如果要输入REPL并进行更详细的检查,可以选择首选的调试器,例如pdb或ipdb。

另外,请查看PythonDebuggingTools Wiki,以获得更全面的可用工具集合。


最初的问题是关于Go,而不是Python。
TMN

是的,我以某种方式错过了。当我检查Python调试器时,它出现在我的搜索中。
Nishant
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.