调试执行冒险
Posted
技术标签:
【中文标题】调试执行冒险【英文标题】:Debug-Execution Adventure 【发布时间】:2011-05-06 11:44:32 【问题描述】:我调试了我的 java 代码。它没有给出任何错误。但是当我执行它时(它也没有给出错误,但是)代码没有成功终止。这很有趣。但这可能吗?
【问题讨论】:
这通常是由于toString
方法的副作用。
我的代码中没有使用任何 tostring() 方法
如果代码语法正确,这是可能的。从 JVM 的角度来看,一切都很好,尽管您的逻辑可能不正确。它显然正确地执行了代码,尽管由于逻辑有缺陷,它并没有达到你的预期......如果你能展示你的代码会更好。
好吧,我一会儿把我的代码放上来……但它涉及到很多异常处理……
【参考方案1】:
当然,当调试器引入的减速确实掩盖了某些竞争条件时,但这通常仅适用于多线程或网络代码。
【讨论】:
【参考方案2】:是的,代码可能在调试时有效,而在运行时无效。我现在能想到的两个可能的原因是
多线程情况下的并发性:如果您的调试器在断点处停止,则多个线程之间的时间可能会发生变化,从而影响行为 在调试时,您可以多次触发代码的某些部分(比在没有调试的情况下执行时更多),例如通过 toString 方法或通过检查或配置一些监视表达式【讨论】:
【参考方案3】:是的,您的代码在语法上可能是正确的(因此可能会在没有任何错误的情况下运行),但在语义上可能不正确。
假设如下:
public int add( int operand1, int operand2)
return operant1 - operand2;
这将运行没有错误,但由于逻辑/实现错误仍然不正确。
因此,通过其他方式平稳运行的代码可能会得到错误的结果。
【讨论】:
但调试的主要目的不就是找出逻辑错误来理解执行流程吗? 是的,您调试是为了发现逻辑错误,但您的成功取决于您如何调试和遵循程序流程。然而,正如其他人已经说过的那样,如果您有多个进程同时运行(根据您的代码似乎就是这种情况),调试可能会掩盖竞争条件,因为它会减慢甚至停止线程的执行。以上是关于调试执行冒险的主要内容,如果未能解决你的问题,请参考以下文章