.NET හි ඔබට කළ හැකි ආකාරයට ජාවා හි වර්තමාන තොග හෝඩුවාව ලබා ගන්නේ Environment.StackTrace
කෙසේද?
මා සොයා ගත් Thread.dumpStack()
නමුත් එය මට අවශ්ය දේ නොවේ - මට අවශ්ය වන්නේ තොග හෝඩුවාව නැවත ලබා ගැනීමට මිස මුද්රණය නොකිරීමට ය.
.NET හි ඔබට කළ හැකි ආකාරයට ජාවා හි වර්තමාන තොග හෝඩුවාව ලබා ගන්නේ Environment.StackTrace
කෙසේද?
මා සොයා ගත් Thread.dumpStack()
නමුත් එය මට අවශ්ය දේ නොවේ - මට අවශ්ය වන්නේ තොග හෝඩුවාව නැවත ලබා ගැනීමට මිස මුද්රණය නොකිරීමට ය.
Answers:
ඔබට භාවිතා කළ හැකිය Thread.currentThread().getStackTrace()
.
එමඟින් StackTraceElement
වැඩසටහනක වර්තමාන සිරස් හෝඩුවාව නිරූපණය කරන s පෙළක් ලැබේ .
String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
අපාචේ කොමන්ස්
new Throwable().getStackTrace()
එය වඩා වේගවත් ය, මන්ද එය this != Thread.currentThread()
ළමා පන්තිය ( Exception extends Throwable
) හරහා ඇමතීමේ විභව ජේවීඑම් පොදු ශීර්ෂයන් පරීක්ෂා කර මග හැරිය යුතු බැවිනි
Thread.currentThread().getStackTrace();
තොගයේ පළමු අංගය කුමක්දැයි ඔබ නොසලකන්නේ නම් හොඳයි.
new Throwable().getStackTrace();
එය වැදගත් නම්, ඔබගේ වර්තමාන ක්රමය සඳහා නිශ්චිත ස්ථානයක් ඇත.
(new Throwable()).getStackTrace()
ද වේගයෙන් ක්රියාත්මක වේ ( bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375302 බලන්න )
(new Exception()).getStackTrace()
විට, ඉල්ලූ තොග හෝඩුවාව වර්තමාන නූල් මත ඇති විට එය දැන් පෙනේ (එය සැමවිටම එසේ වනු ඇතThread.currentThread().getStackTrace();
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
System.out.println(ste);
}
new Exception().printStackTrace(System.out)
මට මතකයි, ෆෝ ලූපයට බොහෝ විට අඩු පිරිවැයක් තිබිය හැක, නමුත් ඔබ මෙය කෙසේ හෝ නිදොස් කිරීමේ කාරණයක් ලෙස පමණක් භාවිතා කළ යුතුය ...
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { if(ste.toString().contains("mypackages")){ System.out.println(ste); } }
Thread.currentThread().getStackTrace();
JDK1.5 සිට ලබා ගත හැකිය.
පැරණි අනුවාදය සඳහා, ඔබව හරවා හැක exception.printStackTrace()
වෙත StringWriter()
:
StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
new Throwable().getStackTrace()
JDK1.4 සිට ලබා ගත හැකිය…
ඒ සඳහා ඔබට Apache ගේ කොමන්ස් භාවිතා කළ හැකිය:
String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
, සම්පූර්ණ රේඛාව:org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
, මම මුලින් නොසලකා කරන - ආනයන භාවිතා lang3
වෙනුවට lang
, හා ප්රතිස්ථාපනය කරනු getFullStackTrace
සමඟ getStackTrace
.
ExceptionUtils.getStackTrace(new Throwable())
ප්රකාශනය භාවිතා කිරීම සතුටක් .
ඇන්ඩ්රොයිඩ් හි මෙය භාවිතා කිරීම වඩා පහසු ක්රමයකි:
import android.util.Log;
String stackTrace = Log.getStackTraceString(exception);
සියළුම නූල්වල සිරස් හෝඩුවාව ලබා ගැනීම සඳහා ඔබට jstack උපයෝගීතාව, JConsole භාවිතා කළ හැකිය, නැතහොත් kill ාතන-සං signal ා යැවිය හැකිය (පොසික්ස් මෙහෙයුම් පද්ධතියක).
කෙසේ වෙතත්, ඔබට මෙය ක්රමලේඛිකව කිරීමට අවශ්ය නම් ඔබට ThreadMXBean භාවිතා කිරීමට උත්සාහ කළ හැකිය:
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = bean.dumpAllThreads(true, true);
for (ThreadInfo info : infos) {
StackTraceElement[] elems = info.getStackTrace();
// Print out elements, etc.
}
සඳහන් කළ පරිදි, ඔබට අවශ්ය වන්නේ වත්මන් නූල්වල සිරස් හෝඩුවාවක් පමණි නම් එය වඩා පහසුය - භාවිතා කරන්න Thread.currentThread().getStackTrace()
;
System.err.println(elems[i])
වී එක් එක් ඒවා කළහොත් ). ස්නිපටයේ දෙවන පේළිය bean.
පෙර අතුරුදහන් වී ඇති dumpAllThreads
නමුත් මම හිතන්නේ බොහෝ දෙනෙකුට එය සාර්ථක කර ගත හැකිය.
ටෝනි, පිළිගත් පිළිතුරට අදහස් දැක්වීමක් ලෙස , OP හි ප්රශ්නයට සැබවින්ම පිළිතුරු සපයන හොඳම පිළිතුර ලෙස පෙනෙන දේ ලබා දී ඇත :
Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );
... OP වෙතින් තොග හෝඩුවාවක් ලබා ගන්නේ කෙසේදැයි විමසුවේ නැත . මම Apache Commons හි විශාල රසිකයෙක් වුවද, ඉහත තරම් සරල දෙයක් ඇති විට බාහිර පුස්තකාලයක් භාවිතා කිරීමට තර්කානුකූල හේතුවක් නොමැත.String
Exception
Thread.getAllStackTraces()
ලබා දෙන a භාවිතා කිරීමට වග බලා ගන්න Map<Thread, StackTraceElement[]>
. හොට්ස්පොට් එකක් ආරක්ෂිතව තැබීමට අවශ්ය සෑම අවස්ථාවකම එය ආරක්ෂා කරයි. සින්ග්ට අනෙකාට බාධා නොකර තනි නූල් ආරක්ෂිත ස්ථානයකට ගෙන යා හැකිය. ස්ටැක්ට්රේස් එකක් ලබා ගැනීම සඳහා ආරක්ෂිත ස්ථානයක් අවශ්ය වේ. Thread.getAllStackTraces()
සියළුම සිරස් හෝඩුවාවන් ලබා ගන්නා අතර සියලු නූල් එක් වරක් පමණක් නතර කරයි. ඇත්ත වශයෙන්ම, ඔබ සැබවින්ම උනන්දු වන්නේ කුමන සිතියම්ගත කිරීමදැයි ඔබ සොයාගත යුතුය.
ස්ටැක්ට්රේස් ලබා ගැනීම:
StackTraceElement[] ste = Thread.currentThread().getStackTrace();
මුද්රණ ස්ටැක්ට්රේස් (ජාවා 8+):
Arrays.asList(ste).forEach(System.out::println);
මුද්රණ සිරස් (ජාවා 7):
StringBuilder sb = new StringBuilder();
for (StackTraceElement st : ste) {
sb.append(st.toString() + System.lineSeparator());
}
System.out.println(sb);
මම ඒක යෝජනා කරනවා
Thread.dumpStack()
පහසු ක්රමයක් වන අතර කිසියම් ගැටළුවක් නොමැති විට ව්යතිරේකයක් හෝ ඉවත දැමිය හැකි දෙයක් සැබවින්ම නොකිරීමේ වාසියක් ඇති අතර එය සැලකිය යුතු ලෙස කාරණයකි.
new Exception("Stack trace").printStackTrace();
කෙටිමඟට කැමතියි, නමුත් මෙම ක්රමයේ ප්රභව කේතය මෙයයි: එබැවින් එය සැබවින්ම විසි කළ හැකි
ජාවා 9 හි නව ක්රමයක් තිබේ:
public static void showTrace() {
List<StackFrame> frames =
StackWalker.getInstance( Option.RETAIN_CLASS_REFERENCE )
.walk( stream -> stream.collect( Collectors.toList() ) );
for ( StackFrame stackFrame : frames )
System.out.println( stackFrame );
}
මට උපයෝගීතා ක්රමයක් ඇත, එය ස්ටැක්ට්රේස් සමඟ නූලක් ලබා දෙයි:
static String getStackTrace(Throwable t) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
t.printStackTrace(pw);
pw.flush();
sw.flush();
return sw.toString();
}
ඒ වගේම ලොග් වෙන්න ...
...
catch (FileNotFoundException e) {
logger.config(getStackTrace(e));
}
java.util.logging.Logger#log(Level, String, Throwable)
දැනටමත් මෙය කරයි. මෙය ජාවා සම්මත පුස්තකාලයේ දැනටමත් පවතින දේවල් අනවශ්ය ලෙස නැවත ලිවීම වන අතර නව සංවර්ධකයින් වැරදි දිශාවකට යොමු කරයි, එය ප්රලේඛනයෙන් away ත්ව ඇත. දැන් මෙය කිරීමෙන් ඔබ ස්ටැක්ට්රේස් නිශ්චිත ආකාරයකින් සංයුති කිරීමට බල කර ඇත, එහිදී logging
API මඟින් ඔබට ලොග් ප්රකාශයේ හැඩතල ගැන්වීම ගතිකව වෙනස් කිරීමට ඉඩ දෙයි. මගේ දැනුමට අනුව, log4j
ඒ හා සමාන හැසිරීම් ද ඇත. රෝදය ප්රතිනිර්මාණය නොකරන්න, මන්ද මා පැහැදිලි කළ දේ ඔබට අහිමි වනු ඇත.
Throwable
වෙත ලකුණු Handler
කිරීමට තුළින් ගේ Formatter
. මම මෙතන ලැයිස්තුගත තියෙනවා කට වඩා වැඩි, Java7 වූ 2012 දී එස් සහ මෙම කාර්යයන් නැවත දුර තවදුරටත් Java7 වටා ගොස් ඇති අතර වඩා දිනය කවෙර්ද; ඒ නිසා J2SE 5.0 javadocs)
ගුආ සමඟ නූල් කිරීමට:
Throwables.getStackTraceAsString(new Throwable())
try {
}
catch(Exception e) {
StackTraceElement[] traceElements = e.getStackTrace();
//...
}
හෝ
Thread.currentThread().getStackTrace()
සමහර විට ඔබට මෙය උත්සාහ කළ හැකිය:
catch(Exception e)
{
StringWriter writer = new StringWriter();
PrintWriter pw = new PrintWriter(writer);
e.printStackTrace(pw);
String errorDetail = writer.toString();
}
'ErrorDetail' නූලෙහි සිරස් තලය අඩංගු වේ.
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
අරාවෙහි අවසාන මූලද්රව්යය තොගයේ පතුල නියෝජනය කරයි, එය අනුක්රමයේ අවම මෑත කාලීන ක්රමවේදය වේ.
A StackTraceElement has getClassName(), getFileName(), getLineNumber() and getMethodName().
StackTraceElement හරහා ලූප් කර ඔබේ අපේක්ෂිත ප්රති .ලය ලබා ගන්න.
for (StackTraceElement ste : stackTraceElements )
{
//do your stuff here...
}
මම ඉහළින් පිළිතුරු භාවිතා කර ආකෘතිකරණය එකතු කළෙමි
public final class DebugUtil {
private static final String SEPARATOR = "\n";
private DebugUtil() {
}
public static String formatStackTrace(StackTraceElement[] stackTrace) {
StringBuilder buffer = new StringBuilder();
for (StackTraceElement element : stackTrace) {
buffer.append(element).append(SEPARATOR);
}
return buffer.toString();
}
public static String formatCurrentStacktrace() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
return formatStackTrace(stackTrace);
}
}
ඔබගේ ක්රියාවලියේ වත්මන් ඇමතුම් තොගය පරීක්ෂා කිරීමට අවශ්ය නම් ඔබට jstack උපයෝගීතාව භාවිතා කළ හැකිය.
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
මෙය පැරණි තනතුරකි, නමුත් මෙන්න මගේ විසඳුම:
Thread.currentThread().dumpStack();
වැඩි විස්තර සහ එහි තවත් ක්රම: http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html
Thread.dumpStack()
කෙලින්ම ඇමතිය යුත්තේ එහි ස්ථිතික ක්රමය නිසාය.