调试复杂问题

调试复杂问题

2014年11月18日发布 in 发展历程
优雅的骆马Magento Translation 博客
Magento翻译,步骤零:必须翻译什么?
2014年10月24日
促销工艺Classy Llama 博客
促销工艺–创建成功的在线促销的艺术
2014年11月26日

最近,我发布了关于避免 常见的编码问题。 这些做法可以帮助减少调试的总时间。即使减少了常见的编码问题,您仍然经常需要调试更复杂的问题。这些是您要么做过的错误’写,有时埋在您正在使用的框架或应用程序的核心中(在我们的示例中为Magento),或者源于不正确或不完整的逻辑。这些类型的问题通常可能需要多种调试技术,尤其是当该错误存在于既未编写也未见的代码中时。

 

问题

客户遇到问题,无法将分组申博娱乐页面上的申博娱乐添加到购物车。隐藏了所有数量的文本框,并且最终以与表示缺货分组申博娱乐相同的方式进行表示。

调试方法

  1. 从简单开始
  2. 检查常见错误
  3. 首先检查最快的东西
  4. 隔离问题的细节
  5. 找出问题的根源
  6. 确定可能影响问题来源的因素
  7. 创建日志以确定哪个因素是罪魁祸首
  8. 修复与代码,用户或数据相关的错误

1.捕获当前状态

进行任何调试之前的第一步是创建数据库的副本。有时,尤其是对于具有多个集成的复杂电子商务站点,可能很难隔离问题。如果我不小心“fix” the problem while debugging it, my efforts at 固定ing the problem long term can be delayed until the problem occurs again. It is also good practice to debug apart from production if the problem can be reproduced 在 a development environment.

2 &3.检查快速修复& Common Mistakes

Once I had that backup, I start by checking things 在 the Magento admin like stock, qty, product status, product websites, product visibility, etc. of the parent grouped product and its child simple products. In this case, I determined that according to the admin, all of the products had satisfactory attribute values. There were at least a few products that were enabled, 在 the appropriate website, 有现货, with a qty greater than the out of stock qty level, and attached correctly to the grouped product. Next, I went to the code that determines whether a product is eligible to be purchased. This code is somewhat spread out, but I determined with a fair degree of certainty that there should have been products eligible to purchase.

4.隔离细节

因为我确定此问题很可能不是由简单的错误引起的,并且我检查了最快的方法,所以我继续隔离问题的具体内容。由于数量文本框是隐藏的,因此我知道导致申博娱乐无法添加到购物车的任何逻辑都与分组的申博娱乐页面相关。我打开了lib / Zend / Db / Adapter / Abstract.php文件,该文件在将查询发送到数据库之前处理了Magento使用的大多数实际SQL调用及其绑定,并添加了一些日志语句。我记录了每个查询及其关联的绑定。然后,我在加载分组申博娱乐页面上的申博娱乐之前创建了一个日志,并在加载它们之后创建了一个日志。通过这样做,我能够确定哪些查询最有可能确定申博娱乐是否符合添加到购物车的条件。

Zend的一种名为Z-Ray的新工具可以简化此查询日志记录过程,因为启用后它会自动显示所有查询。我强烈建议使用此工具调试应用程序,因为它使您无需添加任何日志记录或启用概要分析就可以使用调试信息。

5.隔离源

接下来,我然后寻找一个看起来像是在处理库存的查询。有了这个查询,我去了数据库并运行查询以查看其结果。该查询没有有效的结果。现在,我有了问题的详细信息(数据库没有返回有效的库存项目),因此我开始从查询中删除过滤器,直到它返回行。通过使用这种方法,我能够确定问题与分组申博娱乐本身上设置的库存状态有关。我已经隔离了问题的根源。

6.确定影响来源的因素

接下来,我研究了在代码中在何处设置了此库存状态,以及使用什么条件来确定库存状态应该是存货还是缺货。我确定库存状态应该是“in stock”根据代码中更新库存状态的条件。根据代码,条件应该已经产生了“in stock”状态,但分组申博娱乐仍然“out of stock.”这解释了为什么在我进行初始调试时,没有发现分组和关联的简单申博娱乐的属性有什么问题“检查最快的东西”第一步。由于我知道在这种情况下,通过Magento API动态更新了存储在简单申博娱乐上的库存,因此我研究了根据该库存信息确定库存状态的逻辑。当然,与通过申博娱乐管理部分更新库存商品相比,有一套单独的逻辑可以生成库存状态。由于库存状态代码用于通过API更新库存是不同的,并且我无法通过在管理员中保存申博娱乐上相同的库存水平来重现该问题,因此我确定我需要创建沙盒API调用或实时记录积分。节省申博娱乐实际上可以解决问题,这为我提供了明确的证据,表明我需要找出API所做的不同工作。

7.创建日志以识别罪魁祸首

由于预算比时间轴更受限制,因此我选择在实时集成中记录数据,并等待下一次中断。我通过保存一些分组申博娱乐来临时修复数据,并设置了日志记录语句,这些语句使我可以查看API参数,库存项目,库存状态以及每个API调用的sql查询。这样,我就能确定用于创建非基于API的沙箱调用的确切API调用/参数,并在调试器中逐步完成库存状态更新过程,因为我已经确定了影响该API来源的因素。问题并记录其值。因为我试图确定为什么要分组申博娱乐’的库存状态为假,我确定了一个数组,该数组应该包含以其ID为键的子级简单申博娱乐库存状态的列表。为子申博娱乐状态返回的数组是只有一个键/值对的数组,其中键为1,值似乎是随机数。

通过查看生成子申博娱乐库存状态的代码,我能够确定问题所在。从数据库获取状态的查询正在切换键和值的顺序。库存状态为1,表示为键,而键表示为值。由于每个子申博娱乐的库存状态为1,因此所得数组为键1和最终子申博娱乐ID的值。儿童用品’ stock statuses were then being used to update the parent stock status and since there was no valid child product stock status marked as 有现货, the parent product was being marked as 缺货。

If you would like to view the relevant methods where I found this problem, you can look at Mage_CatalogInventory_Model_Resource_Stock_Status::saveProductStatus and Mage_Catalog_Model_Resource_Product_Status::getProductStatus 在 the else section under the $select and $rows variable assignment. I was working with EE 1.12.0.2 but the error likely exists 在 or around CE 1.7.0.2 as well.

8.解决问题

I was able to 固定 the problem with a simple rewrite of the Mage_Catalog_Model_Resource_Product_Status class by changing the order of the columns 在 the select 在 the getProductStatus() method.

最终,通过遵循上面调试方法部分中列出的步骤,我能够相对快速地找到问题。我遵循的步骤顺序很重要,因为在任何时候我都可以识别出问题,而不必继续调试问题。我强烈建议您使用上述方法或类似方法,以最快的速度找到解决方案,并最终节省时间,金钱和挫败感。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.

最近的帖子查看全部
2020年10月22日

Covid世界中的假日销售:应对挑战

毫无疑问,2020年是历史性的一年。火灾,全球大流行,暴动,老虎王等’只是冰山一角。如 […]
2020年8月7日

涡轮增压ZZPerformance的付费搜索

2020年7月30日

Intermix用经典的Llama加速器击败了M1使用寿命