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_type이 std::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::id 및 std::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] |
|---|