| 216 | |
| 217 | |
| 218 | std::string Exception::getStackTraceString() const |
| 219 | { |
| 220 | auto * stack_trace_frames = get_stack_trace_frames(); |
| 221 | auto stack_trace_size = get_stack_trace_size(); |
| 222 | __msan_unpoison(stack_trace_frames, stack_trace_size * sizeof(stack_trace_frames[0])); |
| 223 | String thread_stack_trace; |
| 224 | std::for_each(capture_thread_frame_pointers.rbegin(), capture_thread_frame_pointers.rend(), |
| 225 | [&thread_stack_trace](FramePointers & frame_pointers) |
| 226 | { |
| 227 | thread_stack_trace += |
| 228 | "\nJob's origin stack trace:\n" + |
| 229 | StackTrace::toString(frame_pointers.data(), 0, std::ranges::find(frame_pointers, nullptr) - frame_pointers.begin()); |
| 230 | } |
| 231 | ); |
| 232 | |
| 233 | return StackTrace::toString(stack_trace_frames, 0, stack_trace_size) + thread_stack_trace; |
| 234 | } |
| 235 | |
| 236 | Exception::Trace Exception::getStackFramePointers() const |
| 237 | { |