【问题标题】:How to print out all the methods called during the execution of a Java program? [duplicate]如何打印出Java程序执行期间调用的所有方法? [复制]
【发布时间】:2017-03-28 00:40:05
【问题描述】:

我有一个 Java 程序(jar 文件),我希望打印出在该程序执行期间调用的所有方法。所以如果Class1.main()调用Class1.foo1(),启动Class2,调用Class2.foo2()Class2.foo3(),那么我希望输出类似于

called Class1.main
called Class1.foo1()
called Class2.<init>
called Class2.foo2()
called Class2.foo3()

请注意,我不希望看到活动的堆栈跟踪,例如当前活动的方法和导致该方法调用的方法,因为它不会打印出那些与调用该方法。我希望查看程序执行期间调用的所有方法,按照它们被调用的顺序。

答案可以利用任何技术,尽管我希望它使用某种调试程序,例如 jdb。这是因为我已经尝试在 Javassist (described in my answer to this question) 中使用检测,但在尝试使用更复杂的程序时遇到了错误。

【问题讨论】:

  • 你不应该发布重复的问题,即使一个是“任何技术”而另一个是“特定技术”。它仍然是重复的。
  • @Nopslide 而不是说它坏了,可能会显示实际发生的错误;可能是无关的。
  • @Eugene 错误信息:Exception in thread "main" Throwable$WrappedPrintStream java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: Could not initialize class java.lang.invoke.CallSite at sun.net.www.protocol.http.HttpURLConnection.getNetProperty(Unknown So urce) at sun.net.www.protocol.http.HttpURLConnection.&lt;clinit&gt;(Unknown Source) Caused by: java.lang.NoClassDefFoundError: Could not initialize class java.lang.invoke.CallSite
  • @Nopslide 问一个新问题怎么样?

标签: java reverse-engineering jdb


【解决方案1】:

你可以试试Java Flight Recorder。不确定您是否可以按照自己喜欢的方式获得输出,但我们将其用于分析,它显示了调用了哪些方法以及哪些方法使用了最多的 CPU 时间。所以肯定有方法记录。

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 2017-08-19
    • 2015-07-27
    • 1970-01-01
    • 2013-10-06
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多