Как получить больше информации об исключении, используя GDB? - PullRequest
0 голосов
/ 23 июня 2018

У меня есть многопоточная программа, в которой какой-то поток вызывает исключение. Я запустил его в GDB, который дает следующий вывод после возникновения исключения и завершения программы:

terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)

Thread 46 "MyProgram" received signal SIGABRT, Aborted.
[Switching to Thread 0x7fff3bfff700 (LWP 24491)]
0x00007ffff48f2428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) where
#0  0x00007ffff48f2428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1  0x00007ffff48f402a in __GI_abort () at abort.c:89
#2  0x00007ffff514d0d5 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff514acc6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff514ad11 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff517719e in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff4c8e6ba in start_thread (arg=0x7fff3bfff700) at pthread_create.c:333
#7  0x00007ffff49c441d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Вывод where на самом деле не помогает выяснить, какой поток вызывает проблему.

Есть ли способ получить больше информации из этой ситуации?

1 Ответ

0 голосов
/ 23 июня 2018

Когда вы видите этот вывод, уже слишком поздно выяснять, какой поток вызвал исключение, потому что ваша программа уже завершена. Я предполагаю, что вам нужно установить catchpoint на std::out_of_range исключение и продолжать запускать программу до тех пор, пока не сгенерируется это исключение:

(gdb) catch throw out_of_range

Когда генерируется исключение, GDB должен остановиться, и вы можете напечатать обратную трассировку потока, который вызывает исключение.

...