稍后有55,000行的生锈代码:调试器出生

2021-05-13 06:41:55

永久链接我很自豪地宣布记录&调试工具(RD)已输入Alpha。

记录&调试工具(RD)是用Rust编写的记录/重播调试器。它是一个项目,将RR项目从C / C ++移植到生锈。为什么这是一个好主意?为什么生锈?为此,请阅读我的一些较旧的帖子和更新:

当前状态:端口基本完成,目前是alpha级别质量。您应该能够为您通常使用RR使用的任务使用RD。 RR项目仍然累积的功能和修复,其中许多人还没有找到进入RD的方式。但是,我的期望是RD应该是合理的,完整和可用现在。请尝试一下!

今天在这个博文帖子里,我想深入了解为什么调试器重要以及你应该关心记录和amp;调试工具(RD)。

在我看来,在程序员' arsenal中受到了升值和投资的推迟工具。现在,每年都有数百个新的编程语言。还有一个不可数的文章,这些文章定期出现关于尝试新的编程语言或Gushy Post关于今年推出的新功能的新功能博客' S热编程语言!

关于调试者也不可能说:调试器领域的决心更加稳重。新的调试器非常偶尔在现场出现。大多数人可能只会将GDB和LLDB命名为他们所知的通用调试器。您还将很少看到粉丝蜡eloquent关于新版本的GDB / LLDB中的新功能(常见的例外)。

是的,有Golang,Python,PHP,Java,.NET等的语言特定调试器。但即使这些调试器也几乎没有与他们提供的价值成比例的注意,并且纯粹的时间最终用户使用它们。

这种历史和实际的原因,对欣赏和投资不足的这种现象。试用者目前实施的调试器往往不是很有用的原因,虫子往往很难重复,一旦错误重复,它难以放下(你曾经在调试器中走过太远,只需要重新启动你的10分钟内容再次?),界面水平过低,断点范式的界面有局限性等。事实上,经常有许多有能力的开发商谁将坚持认为,调试器并不有用,并将避免所有费用 - 他们会鼓励他们其他方法如程序日志等。

此外,调试器被视为无声,凌乱,特殊的案例骑在毫无意义的工程件,难以建立,缺乏在编译设计和实施中看到的理论美容。真相有点细微差别更为细微:是的调试器是非常凌乱和特殊的案件骑行。这是因为它们必然需要在低级别的抽象中运行,因为它们经常处理寄存器,中断,存储器等,但是,编译器就像凌乱 - 大多数人不得不看看,因为他们只是进行解析,键入检查和红外一代,并将脏部留给LLVM。

让'谈论另一个投诉:调试器Don' T有一个理论上有趣的核心。没有东西会离事实很远。关于调试器的工作没有任何内在的行人。正如编译器在编译时使用复杂的算法一样,很好的调试器需要采用复杂的分析和算法,以便在运行时发生的事情。除了主要问题是,很少有人的调试器今天实际上这样做!

在过去的几十年中,调试人员没有经历过编译设计和实施的革命。有很多学术论文写作,博士学位。每年在编译和PL理论领域每年铸造。调试器设计和实现领域也无法说。至少在流行的感知中,在过去几十年的能力方面没有显着进展。

这只能意味着一件事:调试器领域是对中断和创新的成熟。就像LLVM促进了数百个新电脑语言的崛起,我在未来几年内备我的调试和调试器类似的崛起。

科学与工程基于重复性的重要原则。您应该能够可靠地重复某些内容,以便解决它,研究它,改进它。在他们正在学习的事情中,调试者缺乏可重复性的困扰:正在执行的计划。虫子是短暂的:有时他们会揭示自己,有时他们不会' t。所以,像GDB / LLDB这样的最多的调试器可以是相当不满意的工具,因为它们可以在' t" home-in"在他们尝试解决的错误上。这可能是人们在调试器中投入大量投资的原因之一 - 当前调试范式被认为具有固有的限制,它不够强大。

为了解决这种重复性问题,在很久以前的情况下,记录重播调试。概念很简单:记录展示错误的程序的执行,然后稍后重播相同的精确执行。该错误将始终出现在重放中,您可以可靠地调试问题。周围有许多记录和重播系统。

然而,很长一段时间都有一个问题:大多数记录重播系统要么在一些重要的方式或两者都是专有的或有限的能力。

RR调试器在发布时是一种新鲜空气的呼吸。最后,有一个可行的开源记录继电器实现!在调试的历史中,我认为这是一个重要的事件:RR调试器不仅具有新颖的技术方面,它是完全"实用"并且可用于日常调试需求。

思考超越,Record-and-Replay调试提供了一个平台,您可以在其中进行超级充电调试。通过解决可重复问题,您可以更轻松地修复臭虫。但更重要的是,您现在可以在此&#34的顶部构建一些非常神奇和强大的调试工具;基础调试器"您可以进行强大的分析,并采取数据采矿方法来研究您的计划。作为一个进一步的例子,对于粉丝的粉丝的人来说,你可以做一些惊人的事情:复古记录。这允许您在程序已经运行后的程序的区域中插入某些日志记录语句!由于您已经录制了执行,因此程序重播器可以在重放程序时打印出这些日志记录。

这里的重要上行是RR提供了一个平台(就像编译器一样的LLVM),这将允许构建下一代调试工具。 (Pernosco这样的公司正在做那个)。

当然,我想指出RR范例中的记录重播调试不是银弹。并行执行在记录期间基本上序列化。因此,RR无法充分解决大类的并发问题。录制/重放程序可靠地在多个CPU内核上进行平静,并以轻量级方式仍然是一个研究问题。

那么Rd在哪里进入图片? C / C ++语言(GCC,LLVM,GDB,LLDB,SWIFT,JAVAC等内置了大量的编译器/调试器基础架构。 C / C ++的问题和复杂程度良好记录。写作有效的c / c ++就像走一个绳索:一个小错误和你' ll基本上落到你的死亡。现代语言如Rust提供额外的卫兵,而不会妥协于性能。他们也没有假设其程序员与草药嘘声一样聪明! :-)。 C / C ++中的并发性和并行性和并行性等艰难的事情变得更容易生锈。

可悲的是由于历史原因,RR也建于C / C ++。 RR的一些主要开发人员是巨大的生锈粉丝和我'嗯,如果他们今天建造了RR,他们将选择RUDE作为实施语言。看到这个有趣的讨论。

但是,这是否意味着像LLVM一样,我们永远被C / C ++陷入了C / C ++,因为RR等政策软件?

不可以。RR的RD港是我的尝试改变不可避免的性。我在一段时间内被反转调试迷恋。我也相信通常最好的方法来学习一些真的很好,就是以某种方式重新做到。 RD港口一直是我对调试的记录和重播范例的爱情的表达。我很高兴我能到目前为止来到我&#39。很多次我以为我应该放弃 - 我'在将RR移植到上面链接的博客中,他们记录了我的经历。

到目前为止,这个港口一直是一个漫长而孤独的旅程,但我认为RD已经达到了最终用户可以使用它的舞台。希望现在这个项目已达到这个里程碑,其他开发人员也可以与之玩,并提供反馈和贡献。

我有一些梦想和计划。我希望在未来,它可以成为一些退出调试功能的实验室。但是,一旦RD成为RR已经是可靠和非常喜欢的软件,这将只会出现。

请与Rd一起玩,并让我知道是否为您制定了。这是alpha级软件,所以我提前道歉,如果事情不按预期工作!