Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为了调试目的(为了跟踪程序流),记录所有方法是否是一种好的做法?_Java_Android_Performance_Logging - Fatal编程技术网

Java 为了调试目的(为了跟踪程序流),记录所有方法是否是一种好的做法?

Java 为了调试目的(为了跟踪程序流),记录所有方法是否是一种好的做法?,java,android,performance,logging,Java,Android,Performance,Logging,我正在开发一个android应用程序代码库,程序员已经正确地记录了每个应用程序方法的开始和退出。我发现理解应用程序流程非常奇怪,但同时也非常有帮助。这种做法节省了我在理解现有代码流以识别错误方法方面的大量调试工作 因此,我很好奇,以上述方式记录每个方法是否是一种好的做法?(我们总是可以设置一个标志,仅在需要/调试时启用此类日志) 感谢它非常有效,但在特定情况下,如果有多个线程,它实际上会对系统资源造成破坏性影响,尤其是当您登录到单个文件时。但这可以通过将日志记录减少到可以在运行时切换的特定线程来

我正在开发一个android应用程序代码库,程序员已经正确地记录了每个应用程序方法的开始和退出。我发现理解应用程序流程非常奇怪,但同时也非常有帮助。这种做法节省了我在理解现有代码流以识别错误方法方面的大量调试工作

因此,我很好奇,以上述方式记录每个方法是否是一种好的做法?(我们总是可以设置一个标志,仅在需要/调试时启用此类日志)


感谢

它非常有效,但在特定情况下,如果有多个线程,它实际上会对系统资源造成破坏性影响,尤其是当您登录到单个文件时。但这可以通过将日志记录减少到可以在运行时切换的特定线程来解决
我的实现是:-

类跟踪器{ void informCall(对象…callArgs){ meth=TraceUtils.getPreviousMethod(); if(无条件| | tracerCodition.trace(trace.getCallerStackTraceElement())){ //因为跟踪方法可以知道我们在哪个线程中,所以这不是必需的参数 TraceLogger.inform(TraceType.Method,meth.traceString()+“/nargs:/n“+TraceUtils.argsString(callArgs)); } } } 注意:指定跟踪的条件可以提高调试效率,也可以将搜索集中在特定的点上。例如,可能会将跟踪下的方法设置为执行,直到达到某个条件。如果此特定方法终止得太快,则意味着跟踪将不有效,尤其是在存在有意的资源竞争条件或日志写入文件的情况,但设置跟踪条件以仅跟踪方法的特定数量的调用或在特定时间间隔进行跟踪将有助于提高效率

所以,我很好奇,以上述方式记录每个方法是否是一种好的做法?(我们始终可以设置一个标志,仅在需要/调试时启用此类日志)

总的来说,没有

这当然不是公认的良好做法

以下是一些优点和缺点:

  • 是:如果您已经实现了它,那么跟踪日志记录信息很有用

  • 是:您可以关闭跟踪日志记录

  • 否:对于一个非平凡的应用程序,跟踪日志记录的数量可能是巨大的。太多了,无法储存。太多了,无法分析。太多了,无法要求客户发送给您

  • 否:日志记录有运行时开销。。。即使使用logging语句上的运行时保护禁用了日志记录2

  • 否:每个方法开头和结尾的额外日志语句都是“杂乱”的,这使得代码更难阅读

  • 否:假设额外的日志语句是手工添加的,这是额外的编程工作,也是额外的bug来源。(在测试中可能很难发现bug。您是否要编写单元测试/任何检查跟踪是否正确实现的东西?)

  • 否:如果代码是多线程的,跟踪调试可以更改代码的行为。例如,在非线程安全的应用程序中,启用跟踪可能导致意外同步。这可能导致错误应用程序的行为发生变化;c、 f.a

  • 最后,IDE的调试器可能允许您记录方法的入口和出口 无需在源代码级别执行任何操作即可自动执行。(当然,这无助于解决海森堡问题;请参见上文。)


    1-如果是,您会在许多/大多数开源代码库中看到这种做法。我不记得曾经见过它


    2-如果您找到一种方法,通过预处理器、构建/加载时代码注入或
    If(compileTimeConstFlag)
    constructs禁用它,您可以消除开销。但是,这样您就失去了打开和关闭跟踪的灵活性。而且对源代码的影响更大。

    就我个人而言,我会发现这非常嘈杂。记录特定的方法——手动或使用类似的方法——是合理的,但就个人而言,我反对记录每种方法。与其在未知水域游泳,不如打开噪音一段时间来解决手头的错误,一旦关闭这些噪音日志。相关:记录中的其他问题很有用,但如果走极端的话,它可能太吵了,最终你可能会错过真正有用的信息。我通常至少记录关键决策点或计算结果等,有时检查探查器/追踪器以了解发生了什么。无论如何,这主要属于主观性。 class Tracer{ void informCall(Object...callArgs){ meth=TraceUtils.getPreviousMethod(); if(noCondition||tracerCodition.trace(Trace.getCallerStackTraceElement())){ //since trace method can know which thread we are in that is not a necessary argument TraceLogger.inform(TraceType.Method,meth.traceString()+"/nargs:/n"+TraceUtils.argsString(callArgs)); } } }