ජාවා හි වර්තමාන තොග හෝඩුවාව ලබා ගන්නේ කෙසේද?


1009

.NET හි ඔබට කළ හැකි ආකාරයට ජාවා හි වර්තමාන තොග හෝඩුවාව ලබා ගන්නේ Environment.StackTraceකෙසේද?

මා සොයා ගත් Thread.dumpStack()නමුත් එය මට අවශ්‍ය දේ නොවේ - මට අවශ්‍ය වන්නේ තොග හෝඩුවාව නැවත ලබා ගැනීමට මිස මුද්‍රණය නොකිරීමට ය.


73
මම සෑම විටම සූර්යග්‍රහණයේ නිදොස්කරණය කරන විට ඔරලෝසු ප්‍රකාශනයක් ලෙස "නව ව්‍යතිරේකය (). PrintStackTrace ()" භාවිතා කරමි. ඔබ බ්‍රේක්පොයින්ට් එකක අත්හිටුවා ඔබ පැමිණියේ කොහෙන්දැයි දැන ගැනීමට අවශ්‍ය විට එය පහසුය.
ටිම් බෙත්

22
@ ටිම්බෙට්: ඔබ නිදොස් කිරීමේ මාදිලියේ සිටින විට සූර්යග්‍රහණය ඔබට දැනටමත් ස්ටැක් ට්‍රේස් එකක් නොකියයිද? මම එසේ සිතනවා.
ලුයිගි මාසා ගැලරනෝ

41
Arrays.toString (Thread.currentThread (). GetStackTrace ()); සරලයි.
අජේ

2
R අර්කනොන් එය ජාවා යන්නෙන් අදහස් කරන අතර, ඔවුන් එය .net හි කරන්නේ කෙසේද යන්න සහ ජාවාහි සමාන දේ පෙන්වයි.
Pokechu22

9
එය මනාව මුද්‍රණය කිරීම සඳහා ඔබට apache StringUtils භාවිතා කළ හැකිය: StringUtils.join (currentThread (). GetStackTrace (), "\ n");
චිත්‍ර

Answers:


1171

ඔබට භාවිතා කළ හැකිය Thread.currentThread().getStackTrace().

එමඟින් StackTraceElementවැඩසටහනක වර්තමාන සිරස් හෝඩුවාව නිරූපණය කරන s පෙළක් ලැබේ .


49
නූලක් ලබා ගැනීම සඳහා ඔබ දැනටමත් String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e); අපාචේ කොමන්ස්
ripper234

5
අරාවෙහි පළමු මූලද්‍රව්‍යය (දර්ශකය 0) යනු java.lang.Thread.getStackTrace ක්‍රමයයි, දෙවැන්න (දර්ශකය 1) සාමාන්‍යයෙන් උනන්දුවක් දක්වන පළමු අවස්ථාවයි.
lilalinux

178
ක්රියා ඔබට ව්යතිරේකයක් තියෙනවද විට නොවන අතර ඔබ Apache Arrays.toString (. Thread.currentThread () getStackTrace ()) භාවිතා කරමින් නොමැත වැලක් කිරීමට අඩුක්කුව හෝඩුවාවක් පරිවර්තනය කිරීමට එක් නෞකාවක්
ටෝනි

9
විසි කිරීමට අවශ්‍ය නොවන නිසා ටෝනිගේ විසඳුම වඩා හොඳය
mvd

3
පහත දැක්වෙන බොහෝ පිළිතුරු වල පෙන්වා ඇති පරිදි - new Throwable().getStackTrace()එය වඩා වේගවත් ය, මන්ද එය this != Thread.currentThread()ළමා පන්තිය ( Exception extends Throwable) හරහා ඇමතීමේ විභව ජේවීඑම් පොදු ශීර්ෂයන් පරීක්ෂා කර මග හැරිය යුතු බැවිනි
ව්ලැඩ්

266
Thread.currentThread().getStackTrace();

තොගයේ පළමු අංගය කුමක්දැයි ඔබ නොසලකන්නේ නම් හොඳයි.

new Throwable().getStackTrace();

එය වැදගත් නම්, ඔබගේ වර්තමාන ක්‍රමය සඳහා නිශ්චිත ස්ථානයක් ඇත.


35
(new Throwable()).getStackTrace()ද වේගයෙන් ක්‍රියාත්මක වේ ( bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375302 බලන්න )
MightyE

2
Thread.currentThread () හි ප්‍රති results ල getStackTrace () නව විසි කළ හැකි () ට වඩා වෙනස් විය හැකි ආකාරය ඔබට වඩාත් විස්තරාත්මකව පැහැදිලි කළ හැකිද? GetStackTrace ()? මම දෙකම උත්සාහ කර බැලුවෙමි. Thread.currentThread (). GetStackTrace () ආපසු පැමිණෙන්නේ Thread.getStackTrace සමඟ දර්ශක 0 හි වන අතර ඇමතුම් ක්‍රමය දර්ශක 1 හි ඇත. නව විසි කළ හැකි (). දර්ශක 0 හි ක්‍රමය වර්තමාන ක්‍රමයට ක්‍රම දෙකම අර්ථ දක්වා ඇති බවක් පෙනේ, නමුත් ස්ථාන වෙනස් වේ. ඔබ පෙන්වා දෙන තවත් වෙනසක් තිබේද?
රයන්

9
Yan රයන්, Thread.currentThread () getStackTrace () ක්‍රමයේ විවිධ අනුවාදයන්ට වඩා එම ස්ථානය පවත්වා ගැනීමට පොරොන්දු නොවන බවට සහතිකයක් නොමැත. එබැවින් ඔබ එය පරීක්ෂා කර බැලූ විට එය දර්ශක 1 හි විය. සූර්යයා සඳහා ජේවීඑම් (1.5 හෝ 1.6, මතක නැත) හි සමහර අනුවාදයේ එය දර්ශකය 2 විය. එය මා අදහස් කළේ නිශ්චිත ස්ථානයකිනි - පිරිවිතර ඉල්ලා සිටී එය එහි තිබිය යුතු අතර අනාගතයේ එහි රැඳී සිටින්න.
යිෂායි

5
IghtMightyE ජාවා 6 හි සවි කර ඇති පරිදි දෝෂය දැන් වසා ඇති බව වාර්තා වේ. අභ්‍යන්තරය දෙස බලන (new Exception()).getStackTrace()විට, ඉල්ලූ තොග හෝඩුවාව වර්තමාන නූල් මත ඇති විට එය දැන් පෙනේ (එය සැමවිටම එසේ වනු ඇතThread.currentThread().getStackTrace();
එම්. ජස්ටින්

3
J එම් ජස්ටින්: දෝෂය “දැන්” ස්ථාවර ලෙස වාර්තා වී නැත, මයිටිඊ අදහස් දැක්වීම ලිවීමට වසර හයකට පෙර පවා එය නිවැරදි කර ඇත. ඇත්ත වශයෙන්ම, එය ස්ටැකෝවර්ෆ්ලෝ ආරම්භ කිරීමට පෙර සිටම සවි කර ඇත…
හොල්ගර්

181
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
    System.out.println(ste);
}

21
ජාවා සතුව විසි කළ හැකි ලෙස අර්ථ දක්වා ඇති මුද්‍රණ ස්ටැක්ට්‍රේස් ක්‍රමයක් ඇත, ඔබට මෙය කළ හැකිය: new Exception().printStackTrace(System.out)මට මතකයි, ෆෝ ලූපයට බොහෝ විට අඩු පිරිවැයක් තිබිය හැක, නමුත් ඔබ මෙය කෙසේ හෝ නිදොස් කිරීමේ කාරණයක් ලෙස පමණක් භාවිතා කළ යුතුය ...
ජාප්

2
මම මේකට වඩාත්ම කැමතියි ඔබේ මුද්‍රණ ප්‍රකාශය for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { if(ste.toString().contains("mypackages")){ System.out.println(ste); } }
ඔතාගෙන

61
Thread.currentThread().getStackTrace();

JDK1.5 සිට ලබා ගත හැකිය.

පැරණි අනුවාදය සඳහා, ඔබව හරවා හැක exception.printStackTrace()වෙත StringWriter():

StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();

3
new Throwable().getStackTrace()JDK1.4 සිට ලබා ගත හැකිය…
හොල්ගර්

40

ඒ සඳහා ඔබට Apache ගේ කොමන්ස් භාවිතා කළ හැකිය:

String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);

13
මෙය කදිම එක් පේළියේ විසඳුමකි. FYI, භාවිතා කරන ඕනෑම කෙනෙකුට org.apache.commons.lang3, සම්පූර්ණ රේඛාව:org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
fileoffset

2
යන්තම් අවධාරණය කරනුයේ fileoffset ගේ අදහස් කිරීමට ගෙනයන විට org.apache.commons.lang3, මම මුලින් නොසලකා කරන - ආනයන භාවිතා lang3වෙනුවට lang, හා ප්රතිස්ථාපනය කරනු getFullStackTraceසමඟ getStackTrace.
ggkmath

එය ඉතා ප්‍රයෝජනවත් වේ! IDE භාවිතා කර නිදොස්කරණය කිරීමේදී (නිදසුනක් ලෙස, IntelliJ IDEA), තොග හෝඩුවාව ලබා ගැනීම සඳහා ExceptionUtils.getStackTrace(new Throwable())ප්‍රකාශනය භාවිතා කිරීම සතුටක් .
සර්ජි බ un නෝව්

24

ඇන්ඩ්‍රොයිඩ් හි මෙය භාවිතා කිරීම වඩා පහසු ක්‍රමයකි:

import android.util.Log;
String stackTrace = Log.getStackTraceString(exception); 

4
GetStackTraceString නිර්වචනය කර ඇත්තේ කොහේද? මෙය තෙවන පාර්ශවීය ලොග් පුස්තකාලයකින්ද?
skiphoppy


22

සියළුම නූල්වල සිරස් හෝඩුවාව ලබා ගැනීම සඳහා ඔබට 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();


2
මෙම පිළිතුරේ ඇති කේත ස්නිපටය JVM QUIT සං signal ාව (පද්ධති වැනි යුනික්ස් මත) හෝ වින්ඩෝස් මත <ctrl> <break> යැවීමේදී ඔබ දකින ආකාරයේ ඩම්ප් ක්‍රමලේඛනගත කිරීම සඳහා ආසන්න වේ. අනෙක් පිළිතුරු මෙන් නොව ඔබට මොනිටර සහ සමමුහුර්ත කිරීම් මෙන්ම තොග හෝඩුවාවන් පමණක් දැකගත හැකිය (උදා: ඔබ StackTraceElement අරා හරහා පුනරාවර්තනය System.err.println(elems[i])වී එක් එක් ඒවා කළහොත් ). ස්නිපටයේ දෙවන පේළිය bean.පෙර අතුරුදහන් වී ඇති dumpAllThreadsනමුත් මම හිතන්නේ බොහෝ දෙනෙකුට එය සාර්ථක කර ගත හැකිය.
ජෝර්ජ් හෝකින්ස්

22

තවත් විසඳුමක් ( අක්ෂර 35 31 ක් පමණි ):

new Exception().printStackTrace();   
new Error().printStackTrace();

1
නියම විසඳුම. දැන් මට සියලු රාමු හරහා ලූපයක්
දැමිය

21

ටෝනි, පිළිගත් පිළිතුරට අදහස් දැක්වීමක් ලෙස , OP හි ප්‍රශ්නයට සැබවින්ම පිළිතුරු සපයන හොඳම පිළිතුර ලෙස පෙනෙන දේ ලබා දී ඇත :

Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );

... OP වෙතින් තොග හෝඩුවාවක් ලබා ගන්නේ කෙසේදැයි විමසුවේ නැත . මම Apache Commons හි විශාල රසිකයෙක් වුවද, ඉහත තරම් සරල දෙයක් ඇති විට බාහිර පුස්තකාලයක් භාවිතා කිරීමට තර්කානුකූල හේතුවක් නොමැත.StringException


මා සතුව නූල් ලැයිස්තුවක් ඇති අතර ඒවායේ කොටස් සොයා ගැනීමට මට අවශ්‍යය.
ඩැනීල් එස්. යයිට්ස්කොව්

එවැනි අවස්ථාවක, ඔබට Thread.getAllStackTraces()ලබා දෙන a භාවිතා කිරීමට වග බලා ගන්න Map<Thread, StackTraceElement[]>. හොට්ස්පොට් එකක් ආරක්ෂිතව තැබීමට අවශ්‍ය සෑම අවස්ථාවකම එය ආරක්ෂා කරයි. සින්ග්ට අනෙකාට බාධා නොකර තනි නූල් ආරක්ෂිත ස්ථානයකට ගෙන යා හැකිය. ස්ටැක්ට්‍රේස් එකක් ලබා ගැනීම සඳහා ආරක්ෂිත ස්ථානයක් අවශ්‍ය වේ. Thread.getAllStackTraces()සියළුම සිරස් හෝඩුවාවන් ලබා ගන්නා අතර සියලු නූල් එක් වරක් පමණක් නතර කරයි. ඇත්ත වශයෙන්ම, ඔබ සැබවින්ම උනන්දු වන්නේ කුමන සිතියම්ගත කිරීමදැයි ඔබ සොයාගත යුතුය.
රැල්ෆ් එච්

17

මෝඩයා, ඒ Thread.currentThread().getStackTrace();


15

ස්ටැක්ට්‍රේස් ලබා ගැනීම:

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);

14

මම ඒක යෝජනා කරනවා

  Thread.dumpStack()

පහසු ක්‍රමයක් වන අතර කිසියම් ගැටළුවක් නොමැති විට ව්‍යතිරේකයක් හෝ ඉවත දැමිය හැකි දෙයක් සැබවින්ම නොකිරීමේ වාසියක් ඇති අතර එය සැලකිය යුතු ලෙස කාරණයකි.


1
හරි, ඇත්ත වශයෙන්ම, ඩම්ප්ස්ටැක් () ස්ථිතික ක්‍රමයක් වන අතර එය ස්ථිතික ආකාරයකින් ප්‍රවේශ විය යුතුය. ස්තූතියි, සූර්යග්‍රහණය!
තෝමස් ඇඩ්කින්ස්

1
මම new Exception("Stack trace").printStackTrace();කෙටිමඟට කැමතියි, නමුත් මෙම ක්‍රමයේ ප්‍රභව කේතය මෙයයි: එබැවින් එය සැබවින්ම විසි කළ හැකි
ෆ්ලොරන්ට්

13

ජාවා 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 );
}

සිත්ගන්නා සුළුය. :-)
djangofan

10

මට උපයෝගීතා ක්‍රමයක් ඇත, එය ස්ටැක්ට්‍රේස් සමඟ නූලක් ලබා දෙයි:

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));
}

මෙය නෙට්බීන්ස් විසින් ජනනය කරන ලද එක් ස්වයංක්‍රීයව පෙනේ.
ලීෆ් ග ru න්වෝල්ඩ්

ල log ු-සටහන යනු බිල්ට් ලොගර් හෝ ඔබ විසින් සාදන ලද සහ ගොනුවකට ලියන එකකි.
ඩග් හෝෆ්

Og ඩග් හෝෆ්, ලොගර් යනු ජාවා ලොගර් තුළ සාදන ලද යොමු දැක්වීමකි. ඔබ logging.properties ගොනුව වින්‍යාස කිරීමට වග බලා ගන්න. ඔබේ පන්තියේ ආරම්භයේ දී මේ ආකාරයට එකතු කරන්න: පුද්ගලික ස්ථිතික අවසාන ලොගර් ලොගර් = ලොගර්.ජෙට්ලොගර් (ඔබේ_ ක්ලාස්_නාම්.ක්ලාස්.ජෙට්නාම් ());
සැල්වදෝර් වැලෙන්සියා

1
java.util.logging.Logger#log(Level, String, Throwable)දැනටමත් මෙය කරයි. මෙය ජාවා සම්මත පුස්තකාලයේ දැනටමත් පවතින දේවල් අනවශ්‍ය ලෙස නැවත ලිවීම වන අතර නව සංවර්ධකයින් වැරදි දිශාවකට යොමු කරයි, එය ප්‍රලේඛනයෙන් away ත්ව ඇත. දැන් මෙය කිරීමෙන් ඔබ ස්ටැක්ට්‍රේස් නිශ්චිත ආකාරයකින් සංයුති කිරීමට බල කර ඇත, එහිදී loggingAPI මඟින් ඔබට ලොග් ප්‍රකාශයේ හැඩතල ගැන්වීම ගතිකව වෙනස් කිරීමට ඉඩ දෙයි. මගේ දැනුමට අනුව, log4jඒ හා සමාන හැසිරීම් ද ඇත. රෝදය ප්‍රතිනිර්මාණය නොකරන්න, මන්ද මා පැහැදිලි කළ දේ ඔබට අහිමි වනු ඇත.
searchchengine27

1
එය 2012 දී ද පැවතුනි. අවාසනාවකට මෙන් දිනය ඔබගේ නඩුවේ වෙනසක් නොකරයි. [සබැඳිය] බලන්න (docs.oracle.com/javase/1.5.0/docs/api/java/util/logging/Logger.html#log (java.util.logging.Level, java.lang.String, java.lang .තොරවිය හැකි)), [සබැඳිය] (docs.oracle.com/javase/1.5.0/docs/api/java/util/logging/Logger.html#log (java.util.logging.LogRecord)), ආදිය (එහි සමත් වන බව කාර්යයන් කිහිපයක් Throwableවෙත ලකුණු Handlerකිරීමට තුළින් ගේ Formatter. මම මෙතන ලැයිස්තුගත තියෙනවා කට වඩා වැඩි, Java7 වූ 2012 දී එස් සහ මෙම කාර්යයන් නැවත දුර තවදුරටත් Java7 වටා ගොස් ඇති අතර වඩා දිනය කවෙර්ද; ඒ නිසා J2SE 5.0 javadocs)
searchengine27


8
try {
}
catch(Exception e) {
    StackTraceElement[] traceElements = e.getStackTrace();
    //...
}

හෝ

Thread.currentThread().getStackTrace()

ඔබගේ ඉහළම උදාහරණය මඟින් උත්සාහක / අල්ලා ගැනීමේ වාරණයට සාපේක්ෂව තොග හෝඩුවාවක් පමණක් ලබා දෙන්නේ නැද්ද?
ඩෑන් මොනෙගෝ

1
මේ දෙක අතර ඇති වෙනස්කම් මොනවාද
twlkyao

5

සමහර විට ඔබට මෙය උත්සාහ කළ හැකිය:

catch(Exception e)
{
    StringWriter writer = new StringWriter();
    PrintWriter pw = new PrintWriter(writer);
    e.printStackTrace(pw);
    String errorDetail = writer.toString();
}

'ErrorDetail' නූලෙහි සිරස් තලය අඩංගු වේ.


5
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

අරාවෙහි අවසාන මූලද්‍රව්‍යය තොගයේ පතුල නියෝජනය කරයි, එය අනුක්‍රමයේ අවම මෑත කාලීන ක්‍රමවේදය වේ.

A StackTraceElement has getClassName(), getFileName(), getLineNumber() and getMethodName().

StackTraceElement හරහා ලූප් කර ඔබේ අපේක්ෂිත ප්‍රති .ලය ලබා ගන්න.

for (StackTraceElement ste : stackTraceElements ) 
{
    //do your stuff here...
}

අවසාන අංගය සඳහන් කිරීම ගැන ස්තූතියි. ප්‍රති-බුද්ධිමත් සහ මට යම් කාලයක් ඉතිරි කර ගත හැකි විය.
ආලෝකය

.toString () විසින් එම දත්ත සියල්ලම නූලකට ප්‍රතිදානය කරනු ඇත
ව්ලැඩ්

4

මම ඉහළින් පිළිතුරු භාවිතා කර ආකෘතිකරණය එකතු කළෙමි

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);
    }
}

3

ඔබගේ ක්‍රියාවලියේ වත්මන් ඇමතුම් තොගය පරීක්ෂා කිරීමට අවශ්‍ය නම් ඔබට 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

1

මෙය පැරණි තනතුරකි, නමුත් මෙන්න මගේ විසඳුම:

Thread.currentThread().dumpStack();

වැඩි විස්තර සහ එහි තවත් ක්‍රම: http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html


3
Thread.dumpStack () ස්ථිතික බැවින් ඔබ එය කෙලින්ම අමතන්න.
ඩේවිඩ් ඇවෙන්ඩෝසෝරා

2
OP ඇඟවුම් කළේ ඔවුන්ට මුද්‍රණය නොකිරීමට, තොගයේ හෝඩුවාවට කේතයක් යොමු කිරීමක් අවශ්‍ය බවයි.
ටේලර් ආර්

1
av ඩේවිඩ් ඇවෙන්ඩෝසෝරා සඳහන් කළ පරිදි ඔබ Thread.dumpStack()කෙලින්ම ඇමතිය යුත්තේ එහි ස්ථිතික ක්‍රමය නිසාය.
එම්-වජේ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.