How to get original stack trace for unhandled exception in C++?

Viewed 248

This question has been asked before but the solutions proposed there do not work for me. The issue is when an unhandled exception occurs and std::terminate is invoked the original stack trace where the exception is thrown is gone. How can we get that? Here is a simple test app where child thread throw an exception and std:: terminated is called. The core file does not show the original stack trace.

I tried below, none of them works -- i) std::set_terminate(myhandler) -- myhandler is called as expected but this does not affect stack unwinding. ii) compile with -fno-exceptions -- no effect, likely because the exception is thrown from std library.

Any suggestions will be greatly appreciated!

$ cat thread.cpp
#include <utility>
#include <thread>
#include <chrono>
#include <cstdlib>
#include <iostream>
#include <vector>
void f1()
{
    for (int i = 0; i < 10; ++i) {
        std::cout << "Thread 1 executing\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
        // !!! create an exception, how to get the stack trace here.
        std::vector<int> vec;
        vec.reserve(-1);
    }
}
int main()
{
    std::thread t1(f1);
    t1.join();
    std::cout << "Done "  << '\n';
}
$ g++ -g thread.cpp -pthread
$ ./a.out
Thread 1 executing
terminate called after throwing an instance of 'std::length_error'
  what():  vector::reserve
Aborted (core dumped)

$gdb a.out core
...
    Core was generated by `./a.out'.
    Program terminated with signal SIGABRT, Aborted.
    #0  0x00007f7e13084277 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
    56    return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig);
    [Current thread is 1 (Thread 0x7f7e1304d700 (LWP 106036))]
    Missing separate debuginfos, use: debuginfo-install libgcc-4.8.5-28.el7_5.1.x86_64 libstdc++-4.8.5-28.el7_5.1.x86_64
    (gdb) thread apply all bt
    Thread 2 (Thread 0x7f7e14054740 (LWP 106035)):
    #0  0x00007f7e13423f97 in pthread_join (threadid=140179461691136, thread_return=0x0) at pthread_join.c:92
    #1  0x00007f7e13c03e37 in std::thread::join() () from /lib64/libstdc++.so.6
    #2  0x0000000000400f8f in main () at thread.cpp:22
    Thread 1 (Thread 0x7f7e1304d700 (LWP 106036)):
    #0  0x00007f7e13084277 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
    #1  0x00007f7e13085968 in __GI_abort () at abort.c:90
    #2  0x00007f7e13baf7d5 in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc++.so.6
    #3  0x00007f7e13bad746 in ?? () from /lib64/libstdc++.so.6
    #4  0x00007f7e13bad773 in std::terminate() () from /lib64/libstdc++.so.6
    #5  0x00000000004023de in execute_native_thread_routine ()
    #6  0x00007f7e13422e25 in start_thread (arg=0x7f7e1304d700) at pthread_create.c:308
    #7  0x00007f7e1314cbad in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
0 Answers
Related