Wykrywanie wyjątków i generowanie stacktrace

0

Zainspirowany moim wcześniejszym tematem https://4programmers.net/Forum/C_i_C++/353621-przekazywanie_inteligentnych_wskaznikow_i_noexcept i odpowiedzią @alagner próbuję wykryć, gdzie rzucany jest wyjątek w moim programie. W jaki sposób najprościej to zrobić na linuxie(jak wygenerować stacktrace)? Czy da się debugować taki throw jeśli nie mogę uruchomić programu, bo na przykład jest to sterownik układu napędowego rakiety Starship i musiałbym wystrzelić ją w kosmos? Kod oczywiście napisany w celach naukowych, proszę bez czepialstwa.

#include <iostream>
#include <random>

void fun(bool test) noexcept
{
    if (test)
        throw;
}

int main()
{
    std::random_device dev;
    std::mt19937 rng(dev());
    std::uniform_int_distribution<std::mt19937::result_type> dist(0, 1);
    try
    {
        fun(dist(rng));
        fun(dist(rng));
        fun(dist(rng));
    } 
    catch (const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }
    std::cout << "KONIEC\n";
}

EDIT:
Czemu w takim przypadku catch nie łapie wyjątku i program nie kończy się prawidłowo?

#include <iostream>
#include <random>

void fun(bool test) noexcept(false)
{
    if (test)
        throw;
}

int main()
{
    std::random_device dev;
    std::mt19937 rng(dev());
    std::uniform_int_distribution<std::mt19937::result_type> dist(0, 1);
    try
    {
        fun(dist(rng));
        fun(dist(rng));
        fun(dist(rng));
    } 
    catch(...){}
    std::cout << "KONIEC\n";
}
3

A gdzie w Twoim kodzie jest ten wyjątek? Bo ja widzę pusty throw, ale on nie wyrzuca (ew. umyka mi to) istniejącego wyjątku, a wtedy:

If no exception is presently being handled, executing a throw expression with no operand calls terminate() (15.5.1).

EDIT: co do stack trace: jeżeli chcesz debugować post-mortem, musisz na poziomie systemu włączyć generowanie coredumpów, czy to przez ustawienie ulimit -c unlimited czy odpowiednie dodatkowe kroki, to zależy od distro. „Enable coredump generation” i „GDB core dump debugging” do wpisania w Google ;)

0

@alagner: Wszystko brzmi super, ale gorzej z wykonaniem
Wpisuję takie komendy:
ulimit -c unlimited
g++ main.cpp
gdb program core (core to nazwa core dumpa)

efekt jest taki:

Core was generated by `./a.out'.
Program terminated with signal SIGABRT, Aborted.
#0  0x00007f0d8df6f18b in ?? ()
(gdb) bt
#0  0x00007f0d8df6f18b in ?? ()
#1  0x0000000000000000 in ?? ()

Liczyłem, że dostanę coś jak tutaj https://embeddedbits.org/linux-core-dump-analysis/
Jakieś wskazówki?
Kod zmodyfikowałem tak jak pierwsza odpowiedź pod tym linkiem i nic https://stackoverflow.com/questions/77005/how-to-automatically-generate-a-stacktrace-when-my-program-crashes

1

Zobacz z -ggdb3 (albo ogólnie pokombinuj ze switchem -g) w wywołaniu G++.

0

Dla potomnych(albo mnie z przyszłości):
ulimit -c unlimited
g++ main.cpp -g
./a.out włączenie programu i wygenerowanie dumpów
gdb -c core ./a.out core to nazwa pliku z dumpami
bt

#9  0x000055ef03cbb4ac in fun (test=true) at main.cpp:24
#10 0x000055ef03cbb5bf in main () at main.cpp:38

1 użytkowników online, w tym zalogowanych: 0, gości: 1