utility_basic_stacktrace

utility_basic_stacktrace (기본 스택트레이스)

이 페이지는 C++23에서 도입된 std::basic_stacktrace 템플릿 클래스에 대해 설명해요. 스택트레이스는 현재 실행 중인 스레드의 함수 호출 시퀀스를 근사적으로 나타내는 자료구조이며, 각 호출 항목은 std::stacktrace_entry로 표현된답니다. 이 페이지에서는 템플릿 매개변수, 멤버 타입, 멤버 함수, 비멤버 함수, 헬퍼 클래스 등을 다루고 있어요.

출처: cppreference

본문

현재 실행 스레드에서의 현재 평가 (\small{ {x}{0} }) 의 호출 시퀀스(invocation sequence)는 (\small{i \ge 0}) 에 대해 (\small{ {x}{i} }) 가 함수 호출 (\small{ {x}{i+1} }) 내에 있는 평가들의 시퀀스 (\small{ ({x}{0}, \dots, {x}_{n})}) 이에요.

스택트레이스는 호출 시퀀스의 근사적 표현이며, 스택트레이스 항목(entries)들로 구성돼요.

스택트레이스 항목은 스택트레이스에서 하나의 평가를 나타내며, C++ 표준 라이브러리에서는 std::stacktrace_entry로 표현된답니다.

템플릿 매개변수

Allocator - 메모리를 획득/해제하고 그 메모리의 요소를 생성/파괴하는 데 사용되는 할당자예요. 이 타입은 Allocator의 요구 사항을 충족해야 해요. Allocator::value_typestd::stacktrace_entry가 아니면 프로그램은 ill-formed예요.

멤버 타입

멤버 타입 정의
value_type std::stacktrace_entry
const_reference const value_type &
reference value_type &
const_iterator 구현 정의된 const LegacyRandomAccessIterator 타입으로, random_access_iterator 모델을 만족해요
iterator const_iterator
reverse_iterator std :: reverse_iterator < iterator >
reverse_const_iterator std :: reverse_iterator < const_iterator >
difference_type 구현 정의된 부호 있는 정수 타입
size_type 구현 정의된 부호 없는 정수 타입
allocator_type Allocator

멤버 함수

(constructor) 새로운 basic_stacktrace를 생성해요 (공개 멤버 함수) [edit]
(destructor) basic_stacktrace를 파괴해요 (공개 멤버 함수) [edit]
operator= basic_stacktrace에 할당해요 (공개 멤버 함수) [edit]
current [static] 현재 스택트레이스 또는 그 일부를 얻어요 (공개 정적 멤버 함수) [edit]
get_allocator 연관된 할당자를 반환해요 (공개 멤버 함수) [edit]
반복자(Iterators)
begin cbegin 시작을 가리키는 반복자를 반환해요 (공개 멤버 함수) [edit]
end cend 끝을 가리키는 반복자를 반환해요 (공개 멤버 함수) [edit]
rbegin crbegin 시작을 가리키는 역방향 반복자를 반환해요 (공개 멤버 함수) [edit]
rend crend 끝을 가리키는 역방향 반복자를 반환해요 (공개 멤버 함수) [edit]
용량(Capacity)
empty basic_stacktrace가 비어 있는지 확인해요 (공개 멤버 함수) [edit]
size 스택트레이스 항목의 개수를 반환해요 (공개 멤버 함수) [edit]
max_size 가능한 최대 스택트레이스 항목 수를 반환해요 (공개 멤버 함수) [edit]
요소 접근(Element access)
operator[] 지정된 스택트레이스 항목에 접근해요 (공개 멤버 함수) [edit]
at 경계 검사를 포함해 지정된 스택트레이스 항목에 접근해요 (공개 멤버 함수) [edit]
수정자(Modifiers)
swap 내용을 교환해요 (공개 멤버 함수) [edit]

비멤버 함수

operator== operator<=> (C++23) basic_stacktrace 값의 크기와 내용을 비교해요 (함수 템플릿)
std::swap (std::basic_stacktrace) (C++23) std::swap 알고리즘을 특수화해요 (함수 템플릿) [edit]
to_string (C++23) basic_stacktrace에 대한 설명이 담긴 문자열을 반환해요 (함수 템플릿) [edit]
operator<< (C++23) basic_stacktrace의 스트림 출력을 수행해요 (함수 템플릿) [edit]

헬퍼 클래스

std::hash std::basic_stacktrace (C++23) std::basic_stacktrace에 대한 해시 지원 (클래스 템플릿 특수화) [edit]
std::formatter std::basic_stacktrace (C++23) basic_stacktrace에 대한 포맷 지원 (클래스 템플릿 특수화) [edit]

참고 사항

사용자 정의 할당자 지원은 핫 경로(hot path)나 임베디드 환경에서 basic_stacktrace를 사용할 수 있도록 제공돼요. 사용자는 stacktrace_entry 객체를 스택이나 적절한 다른 장소에 할당할 수 있답니다.

std::basic_stacktrace가 소유한 std::stacktrace_entry 객체들의 시퀀스는 불변이며, 비어 있거나 전체 스택트레이스의 연속된 구간을 나타내요.

std::basic_stacktrace를 사용할 수 없을 때는 boost::stacktrace::basic_stacktrace(Boost.Stacktrace에서 제공)를 대신 사용할 수 있어요.

Feature-test macro 표준 기능
__cpp_lib_stacktrace 202011L (C++23) Stacktrace 라이브러리
__cpp_lib_formatters 202302L (C++23) std::thread::idstd::stacktrace 포맷

예제

Compiler Explorer에서 얻은 출력: msvc 및 gcc.

#include <iostream>
#include <stacktrace>

int nested_func(int c)
{
    std::cout << std::stacktrace::current() << '\n';
    return c + 1;
}

int func(int b)
{
    return nested_func(b + 1);
}

int main()
{
    std::cout << func(777);
}

가능한 출력:

// msvc output (the lines ending with '⤶' arrows are split to fit the width):
0> C:\Users\ContainerAdministrator\AppData\Local\Temp\compiler-explorer-compiler20221122-⤶
31624-2ja1sf.8ytzw\example.cpp(6): output_s!nested_func+0x1F
1> C:\Users\ContainerAdministrator\AppData\Local\Temp\compiler-explorer-compiler20221122-⤶
31624-2ja1sf.8ytzw\example.cpp(12): output_s!func+0x15
2> C:\Users\ContainerAdministrator\AppData\Local\Temp\compiler-explorer-compiler20221122-⤶
31624-2ja1sf.8ytzw\example.cpp(15): output_s!main+0xE
3> D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288): output_s!⤶
__scrt_common_main_seh+0x10C
4> KERNEL32!BaseThreadInitThunk+0x14
5> ntdll!RtlUserThreadStart+0x21
779

gcc output:
   0# nested_func(int) at /app/example.cpp:7
   1# func(int) at /app/example.cpp:13
   2#      at /app/example.cpp:18
   3#      at :0
   4#      at :0
   5# 

779

같이 보기

stacktrace_entry (C++23) 스택트레이스에서 하나의 평가를 나타내는 표현 (클래스) [edit]

더 알아보기 (Learn more)

cppreference