С вашим скриптом:
backtrace
quit
... вы увидите трассировку стека только тогда, когда подчиненный собирается завершить работу (или когда вы используете основной файл, как в вашем примере, когда он уже вышел), потому что вы не сказали gdb останавливаться где-либо .
Другой подход заключается в использовании команды gdb catch throw
, плюс немного сценариев. Таким образом, вы можете захватить трассировку стека в каждом throw
. Вы могли бы сделать это так:
(gdb) catch throw
Catchpoint 1 (throw)
(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
> silent
> backtrace
> continue
> end
Это будет останавливаться на каждом throw
и печатать обратную трассировку. Однако вы не хотите выводить следы стека из фрейма fatal
. Для этого вы можете использовать вспомогательную функцию GDB и сделать условную точку захвата условной:
(gdb) cond 1 $_any_caller_matches("fatal", 10)
(«10» - это всего лишь предположение о том, сколько кадров может отделить fatal
от внутренней части библиотеки C ++, которая обрабатывает бросок.)