在程序中的任何位置生成 Java 堆栈跟踪 [重复]

Posted

技术标签:

【中文标题】在程序中的任何位置生成 Java 堆栈跟踪 [重复]【英文标题】:Generate a Java stacktrace at any point in the program [duplicate] 【发布时间】:2012-10-21 14:43:27 【问题描述】:

可能重复:Get current stack trace in Java

我有一种将消息保存到文件的方法。从我的主程序的许多不同部分调用此方法。有什么方法可以按需生成堆栈跟踪,即使 Exception 没有被触发?

例如,我希望有这样的东西......

void saveMsg(String Msg)

  if (a==b) Print Out Where This Method Was Called From [ like stackTrace in exception ]
  else saveMsgToFile(filePath,Msg);

我知道 Java 可以在 Exception 中进行堆栈跟踪,但是当没有出现 Exception 时如何生成堆栈跟踪?

【问题讨论】:

【参考方案1】:

不幸的是,只有

    Thread.currentThread().getStackTrace();

对您的任务很有用。问题是前面提到的所有方法都会将您的方法 (saveMsg) 打印在堆栈的顶部,但这通常是不可取的。相反,您必须跳过从 getStackTrace() 方法返回的第一个元素。

【讨论】:

【参考方案2】:

您可以生成自己的Exception 并捕获结果...

try 
    throw new Exception("Tracing only");

catch (Exception e)
    e.printStackTrace();

将此代码放在您想要输出堆栈跟踪的任何位置。

这样做的好处是e.printStackTrace(); 方法可以很好地为您处理输出,假设您想要输出到控制台。通过触发Exception,您还可以为原因指定一个文本字符串(在本示例中为"Tracing only"),这样您就可以使用有意义的标头轻松自定义跟踪输出,例如"Tracing the saveMsg method"

或者,您可以通过调用它来获取堆栈跟踪本身...

Thread.currentThread().getStackTrace();

但是,这会给您留下一个 StackTraceElements 数组,您必须循环输出。在我看来,像第一个选项一样,生成并捕获自己的Exception 会更容易、更干净。

【讨论】:

你不需要抛出异常来打印堆栈跟踪。只需 new Exception().printStackTrace() 即可。【参考方案3】:

只需执行Thread.dumpStack(),这会将堆栈跟踪打印到控制台。无需创建异常并捕获它。

【讨论】:

以上是关于在程序中的任何位置生成 Java 堆栈跟踪 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

我的程序崩溃时如何自动生成堆栈跟踪

在发布模式下显示 .NET 程序集的堆栈跟踪中的行号

Google App Engine 如何实现分析(堆栈跟踪)?

堆栈跟踪中没有函数名称,GDB,但出现在LLDB中[重复]

找不到 android NDK 堆栈跟踪

“/”应用程序中的服务器错误。