假设我们有一个像这样的函数:
public void myStart()
{
for (int i = 0; i<10; i++) myFunction(i);
}
private int myFunction(int a)
{
a = foo(a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
//something gnarly here
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
现在无论出于何种原因,我们的代码都无法正常工作。可能是抛出错误,可能是返回了错误的值,或者它陷入了无限循环。
第一年的程序员要做的第一件事就是打印到控制台/标准输出(在学习使用调试器之前已经学会了如何打印Hello World)。
例如,要调试此代码,他们可以执行以下操作:
private int myFunction(int a)
{
print("before foo: a=" + a);
a = foo(a);
print("before bar: a=" + a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
print ("foo step1: a=" + a);
//something gnarly here
print ("foo step2: a=" + a + " someOtherValue="+ someOtherValue + " array.length= " + someArray.length());
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
现在,他们运行代码,得到较大的控制台打印结果,可以跟踪出现问题的地方。
当然,另一种方法是设置断点,并在每个点处逐步执行代码。
打印到控制台的一个主要优点是,开发人员可以一次性查看值的流程,而无需单击步骤等。
但是缺点是,您的代码中充满了所有这些需要删除的打印语句。
(是否有可能告诉调试器仅将某些值打印到日志中?然后可以在不实际修改代码的情况下轻松地添加或删除断点。)
我仍然将控制台打印作为主要的调试方法,我想知道与其他方法相比,这种方法有多普遍/有效。