考虑下面的两个简单的Java类:
第一个例子
class Computer {
Computer() {
System.out.println("Constructor of Computer class.");
}
void On() {
System.out.println("PC turning on...");
}
void working() {
System.out.println("PC working...");
}
void Off() {
System.out.println("PC shuting down...");
}
public static void main(String[] args) {
Computer my = new Computer();
Laptop your = new Laptop();
my.On();
my.working();
your.On();
your.working();
my.Off();
your.Off();
}
}
第二个例子
class Laptop {
Laptop() {
System.out.println("Constructor of Laptop class.");
}
void On() {
System.out.println("Laptop turning on...");
}
void working() {
System.out.println("Laptop working...");
}
void Off() {
System.out.println("Laptop shuting down...");
}
}
程序运行后,如何跟踪(1)哪个对象调用哪个方法(2)以及执行多少次?
稍微精确一点,我可能有100个类和1000个对象,每个对象都调用100多个方法。我希望能够跟踪(在运行程序之后)哪个对象调用了哪种方法以及调用了多少次。
感谢您的任何建议。
这将为所有线程中所有对象的每个方法调用打印一行:
Runtime.traceMethodCalls()(在Java 9中已弃用/无操作)
和
Runtime.traceInstructions(在Java 9中已弃用/无操作)
您可以使用 housemd 或
btrace 或
inTrace之 类的呼叫跟踪器
要进行更复杂的分析,可以使用以下一种调用图实用程序:
javashot
java-callgraph
(这是 一篇有关该主题的文章)
计划将上面不推荐使用的方法删除,因为现在有特定于JVM的替代方法:
这两个工具都非常容易设置和开始收集信息,并且具有不错的GUI界面。它们附加到正在运行的JVM进程上,并允许进行线程快照和其他各种诊断(Visual
VM有很多可用的插件,但是如果您想超越默认行为,则可能需要花一些时间来进行配置和了解,而默认情况下,JFR具有更多功能)。
另外,请不要低估JVM分布式命令行实用程序($JAVA_HOME/bin
)用于执行一些易于访问的诊断的有用性。
问题内容: 有没有一种方法可以为java中的特定线程输出调用跟踪? 我不需要堆栈跟踪。我想在每个对象上进行一系列调用以进行跟踪。 问题答案: 我想您可能会发现这很有趣。它是一个Java代理,它使用slf4j框架将日志记录添加到方法中,从而实际记录输出。然后,只需配置日志记录框架以仅打印出您感兴趣的线程即可。 http://www.slf4j.org/extensions.html#javaagen
我很难找到一种方法来跟踪方法执行(例如:在执行时调用方法...) 下面是我想追踪的代码片段: 我想知道JsonSaniitier类的方法sanitize已被调用... 我尝试运行jStack,但是在堆栈跟踪中没有看到任何JsonSanitizer.sanitize方法的出现。 提前谢谢
我做了很多年的Java开发人员,主要是使用spring开发MVC Web应用程序。我正在学习Kotlin和Android作为一个自我开发项目,并且大部分都很喜欢它。我通常只是把事情弄清楚,但我认为我在这里遗漏了一些重要的东西(因为我喜欢编写易于维护且不容易出现异常的代码)。我理解与Java的互操作性,我只是对我的Kotlin代码是如何编译的感到困惑,并且对Java方法调用抛出异常没有任何警告。 下
对于单元测试目的和模板方法模式,我需要动态调用一些方法,如下所示: 这是可行的,但当方法失败(断言失败或运行时异常)时,我无法获得完整的失败跟踪。例如,如果您有一个序列调用:method1()- 这是在代码中显式调用“方法1()”时的正常显示。但是如果这样做了:myobject.get类()。get方法(“方法1”)。调用()。如果方法3失败,您会有以下失败跟踪: 因此,当使用反射(m.invok
问题内容: 如何获得Java中的当前堆栈跟踪,就像你可以在.NET中那样? 我找到了,但这不是我想要的-我想找回堆栈跟踪信息,而不是打印出来。 问题答案: 你可以使用。 这将返回一个数组,该数组代表程序的当前堆栈跟踪。
问题内容: 如何理解java的栈跟踪(stack trace) ?怎样使用它来调试程序? 问题答案: 简单来说,堆栈跟踪是应用程序在引发时处于中间的方法调用的列表。 简单的例子 通过问题中给出的示例,我们可以准确确定在应用程序中引发异常的位置。让我们看一下堆栈跟踪: 这是一个非常简单的堆栈跟踪。如果我们从列表的开头开始,我们可以判断出错误发生在哪里。我们正在寻找的是应用程序中最顶层的方法调用。在这