Slide 1

Slide 1 text

$ ελοΫτϨʔεϥΠϒϥϦ ߴڮ থ "LJSB5BLBIBTIJ GBJUIBOECSBWF!HNBJMDPN 1SFGFSSFE/FUXPSLT *OD ۚ $.*9

Slide 2

Slide 2 text

$ελοΫτϨʔεͷϥΠϒϥϦ • ελοΫτϨʔε͸ɺσόοάͷͨΊͷػೳͰ͢ • Τϥʔͷ৔ॴ͕Ͳ͏͍͏ܦ࿏Λḷͬͯͦ͜ʹࢸͬͨͷ͔ΛऔಘͰ͖ ·͢ Ҿ਺͸ͱΕͳ͍ • ελοΫτϨʔε͸ϓϥοτϑΥʔϜʹऔಘͰ͖Δํ๏͕ఏڙ͞Ε ͍ͯ·͕ͨ͠ɺඪ४ϥΠϒϥϦʹೖͬͨ͜ͱͰڞ௨Խ͞Ε·ͨ͠ • ࠓճ͸ɺ͜ͷϥΠϒϥϦͷ࢖͍ํͱఆٛΛղઆ͍͖ͯ͠·͢

Slide 3

Slide 3 text

جຊతͳ࢖͍ํ #include #include void g() { std::println("{}", std::stacktrace::current()); } void f() { g(); } int main() { f(); } 0# g() at /app/example.cpp:5 1# f() at /app/example.cpp:9 2# main at /app/example.cpp:13 3# at :0 4# __libc_start_main at :0 5# _start at :0 6#

Slide 4

Slide 4 text

͜ͷߦΛߟ͑Δ • std::basic_stacktraceͱ͍͏Ϋϥε͕ελοΫτϨʔεΛऔಘ͢Δ ͨΊͷΫϥε • ͦͷผ໊ͱͯ͠std::stacktrace͕ఆٛ͞ΕΔ std::println("{}", std::stacktrace::current()); namespace std { template class basic_stacktrace; using stacktrace = basic_stacktrace>; }

Slide 5

Slide 5 text

͜ͷߦΛߟ͑Δ • std::basic_stacktraceΫϥεͷTUBUJDϝϯόؔ਺current()Ͱ ελοΫτϨʔεΛऔಘ͢Δ • skip max_depthʹ͍ͭͯ͸͋ͱͰઆ໌ std::println("{}", std::stacktrace::current()); static basic_stacktrace current(); static basic_stacktrace current(size_type skip); static basic_stacktrace current(size_type skip, size_type max_depth);

Slide 6

Slide 6 text

͜ͷߦΛߟ͑Δ • std::basic_stacktraceΫϥε͸จࣈྻ΁ͷม׵ػೳ͕͋Δ • std::format()༻ͷformatterಛघԽ • ग़ྗετϦʔϜ༻ͷoperator<<Φʔόʔϩʔυ • to_string()ϝϯόؔ਺ std::println("{}", std::stacktrace::current()); cout << std::stacktrace::current() << endl; std::string trace = std::stacktrace::current().to_string();

Slide 7

Slide 7 text

͜ͷߦΛߟ͑Δ • std::basic_stacktraceΫϥε͸std::stacktrace_entryΫϥεͷ഑ྻ • operator[ ] at()ɺsize()ϝϯόؔ਺΍begin() end()Λ࢖֤ͬͯߦͷ ৘ใʹΞΫηεͰ͖Δ • औಘͰ͖Δ৘ใ͸ҎԼɿ • source_file() ιʔεϑΝΠϧ໊ ύε • source_line() ߦ൪߸ • description() આ໌ ؔ਺໊function_name()͸ͳ͍ • operator bool() ۭͰͳ͍͔൑ఆ • ελοΫτϨʔεͷ֤ߦͷ൪߸͸std::basic_stacktraceଆͰ͚͍ͭͯΔ std::println("{}", std::stacktrace::current()); 0# g() at /app/example.cpp:5 1# f() at /app/example.cpp:9 2# main at /app/example.cpp:13 3# at :0 4# __libc_start_main at :0 5# _start at :0 6#

Slide 8

Slide 8 text

ओͳར༻ํ๏ template void throw_exception(string_view error) { println(stderr, "{}", stacktrace::current(1)); throw E{string{error}}; } void g() { throw_exception("error"); } • ελοΫτϨʔεΛग़ྗ͔ͯ͠Βྫ֎Λ౤͛Δ • current(1)ͱ͢Δ͜ͱͰࣗ਎ͷؔ਺Λআ͍ͨελοΫτϨʔεʹͰ͖Δ • ΤϥʔΛग़ྗ͢Δؔ਺ࣗମͷ৘ใ͸͍͍͍ͩͨΒͳ͍ ΤϥʔॲཧΛ։࢝͢Δ৔ॴ͕࠷ॳʹ΄͍͠

Slide 9

Slide 9 text

Τϥʔ಺༰ͷ͕͍ͪ 0# g() at /app/example.cpp:12 1# f() at /app/example.cpp:16 2# main at /app/example.cpp:20 3# at :0 4# __libc_start_main at :0 5# _start at :0 6# terminate called after throwing an instance of 'std::invalid_argument' what(): error 0# void throw_exception(str ing_view) at /app/example.cpp:7 1# g() at /app/example.cpp:12 2# f() at /app/example.cpp:16 3# main at /app/example.cpp:20 4# at :0 5# __libc_start_main at :0 6# _start at :0 7# terminate called after throwing an instance of 'std::invalid_argument' what(): error current()ͷ৔߹ current(1)ͷ৔߹

Slide 10

Slide 10 text

ิ଍ • 7JTVBM4UVEJPͷΑ͏ͳσόοΨ෇͖؀ڥͰ͸ɺσόοά࣌ʹε λοΫτϨʔε͕දࣔ͞Ε·͢ • ($$΍$MBOHͰσόοΨΛͭͳ͙ͷ͕ΊΜͲ͍͘͞؀ڥͰ͸ɺ ελοΫτϨʔεΛग़ྗͯ͠͠·͏ͷ͕ϥΫͰ͢ • ΤϥʔϩάʹΤϥʔ৘ใΛग़ྗ͓ͯ͘͜͠ͱͰɺ໰୊ͷௐ͕ࠪ ͠΍͘͢ͳΓ·͢