信息很少的调试提示?[关闭]


11

我继承了一个具有相当大代码库的项目,而最初的开发人员很少(如果有的话)回复电子邮件。有很多不同的方法可以执行其中的某些操作,但我并不全都知道。这些路径上有很多重复的代码(而不是5个页面所包含的功能做的是相同的事情,而是5个页面中复制的代码),以及数据库中的一些细微问题(我们都听说过意大利面条式代码) ,但您有没有听说过意大利面条数据库?)

所有这些我大部分时间都可以处理,没有问题。

问题是客户在某处发现错误时。他们通常会发送最终问题的屏幕截图,然后说:“您能看看这个吗?” 同时在页面上突出显示错误的特定内容,有时甚至是预期的内容。给出的信息很少,而尝试与他们交谈并获得更多信息(例如他们为获得结果所做的事情)就像在咬牙。

基本上,可以归结为:

  • 我不是100%熟悉的大型复杂代码库
  • 事情可能会出错
  • 关于如何产生错误的信息很少

有人对如何调试这类东西有任何提示,技巧,建议等吗?


“您听说过意大利面数据库吗?” 我曾经从事过一项工作,该产品的数据库已经持续发展了十多年,随着需求的增长(以及增长,增长,增长和增长),几乎没有做出任何努力来重构它。我有一个同事,整个工作归结为“了解数据库,创建SQL查询以从中提取有用的东西”,而她是必不可少的。我感到你很痛苦。
BlairHippo 2010年

作为补充,[阅读Raymond Chen博客上的“心理调试”文章](goo.gl/2KIH)!
Wizard79 2010年

代码库有多大?十个KLOC还是50 MLOC?
Basile Starynkevitch

Answers:


11

当我得到类似的信息时,通常需要更多信息。不确定您的工作方式如何,但是在这里,如果我没有足够的信息来在本地重现该问题,我可以将票证打回“无法重现”,并要求提供更多信息,他们知道什么都没有解决,直到我可以打破它。

如果您的客户在描述步骤时遇到麻烦,请向他们索取截屏视频。有一些免费产品可以创建它们,例如Jing。 当您可以准确地观察他们在做什么时,这使操作变得容易得多。

编辑: 几年前我写这篇文章时,Jing是个好主意。从那时起,他们修改了安装程序,以使用您从未要求的“奖励”废话软件加载您的系统,因此我不再推荐它。不过,周围有很多不错的屏幕录像机。


2
+1声音建议,我将其扩展为:他们能否使错误可靠地发生,还是断断续续的?如果情况确实可靠,他们是否可以引导您完成到达目的地的步骤?
BlairHippo 2010年

1
查看日志文件会有所帮助。
pramodc84 2010年

11

本书可能是一个好的开始。

替代文字

我正在使用以下定义,因为听起来好像开发人员已不再支持它。

旧版代码是与不再受支持有关的源代码。


可悲的是,这甚至不是遗留代码。我可以肯定,我正在从事的大多数工作都是在今年年初开始的。
塔尔卡

3
@Slokun-本书中“传统代码”的定义与它的传统定义并不完全相同。这是一本很好的书。
奥斯丁·萨洛宁

4

几年前,我遇到了类似的问题,生产力和代码清理的最大进步是将错误跟踪集成到系统中。

我们使用了Fogbugz(我想他们仍然可以使用Fogcreek!),并且我们能够建立一个异常处理机制,使用户可以在引发异常的任何时间按下按钮,并且可以立即将其登录到我们的系统中-不再需要调用和没有更多的截图。 使用此选项,您可以获取所需的信息,而不是尝试从用户中提取信息。 听起来像一个变体会给您带来一些好处,尤其是使用屏幕截图捕获选项时。

您要开始做的另一件事是开始添加日志记录。您可能想深入记录每个带有参数值的方法调用。由于听起来好像您正在使用旧版代码(没有测试的代码),所以此日志记录将帮助您添加适当的单元测试,因此您不会重复任何问题。


对于庞大的现有代码库,添加良好的日志记录将是很多工作的地狱。+1,因为如果错误是间歇性的,它可能是唯一可行的选择。
BlairHippo 2010年

@BlairHippo:从我的经验来看,是这样,但这就是您所描述的代码库所要付出的代价。就像在这样的代码库中开始一样,这几乎是可悲的……
Austin Salonen 2010年

记录是困难的。添加自动异常日志记录是微不足道的,并且值得(最少)花费一千倍。或者至少在德尔福。不确定是否存在其他语言的解决方案,但是对于具有良好异常处理能力的任何语言来说,这都不应该太困难。
梅森惠勒2010年

1

我最认真的建议是在可能的地方开始重构。我无法计数看到功能重新复制的次数,只是发现它不是100%完整复制。这是99.9%的副本和1个小错误,导致错误。开始向所有内容添加单元测试,如果您有质量检查部门,请尝试为您正在使用的代码的这些部分提供一些自动化测试脚本。

另一方面,查看可以向代码中注入多少日志。也就是说,如果日志记录方式不多,则可以在代码中添加一个标志,以开始为自己的调试目的选择更多详细的日志记录。如果您可以打开对话框,则可以打开和关闭用户。它为我提供了无以计数的帮助。如果没有问题的图片,我通常会收到“它不起作用”的提示。我只是说“发送日志文件给我”。


0

首先编写单元测试。选择一个类或一个函数,并编写一组与您认为的工作方式相对应的测试。如果测试失败,请找出原因。如果是错误,请修复。如果您的期望被证明是错误的,请找出实际的功能并相应地修改测试。

一旦有了一套不错的工作单元测试,便有了一个安全网,可以进行一些重构以使代码更整洁。

不断迭代,直到您了解代码库。

不用说,这是您应该提前做的事情,而不是响应错误报告。

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.