{# select callstack of thread N on ''. Rendered as the server renders one in its own error messages (|.call N Function, source.cpp, module; params: ...), so an admin who has read a DMS stack trace before reads this one the same way. Innermost frame first, carrying the highest number, counting down to the entry point. #}
{{ t("threads.badge.stack") }} {{ t("threads.frames", n=outcome.frames|length) }} {% if outcome.truncated %}({{ t("threads.stack_truncated") }}){% endif %} {% if outcome.server %} {{ outcome.server }}{% if outcome.computer %} ยท {{ outcome.computer }}{% endif %} {% endif %}
{% for failure in outcome.errors %} {% endfor %} {% if outcome.row %} {# What the thread was doing when the dump was taken. Without this the stack is a wall of C++ with nothing to hang it on. #}
{{ t("threads.threads.column.queue") }}: {{ outcome.row.queue }} {{ t("threads.threads.column.number") }}: {{ outcome.row.number }} {{ t("threads.threads.column.jobname") }}: {{ outcome.row.jobname or "-" }} {{ t("threads.threads.column.username") }}: {{ outcome.row.username or "-" }} {{ t("threads.threads.column.running") }}: {{ t("threads.yes") if outcome.row.running else t("threads.no") }}
{% endif %} {% if not outcome.frames %}
{{ t("threads.stack_empty") }}
{% else %}
{% for frame in outcome.frames %} {% endfor %}
# {{ t("threads.frame.function") }} {{ t("threads.frame.source") }} {{ t("threads.frame.module") }} {{ t("threads.frame.params") }}
{{ frame.index }} {{ frame.function or "-" }} {{ frame.source or "-" }} {{ frame.module }} {{ frame.params or "" }}
{% endif %}