Kiedy wyjątek zostanie rzucony (i złapany), wszystkie zmienne na stosie zostaną zniszczone [
link]. Może się to okazać kłopotliwe, jeżeli chcemy skorzystać z debuggera i odnaleźć przyczynę. GDB oferuje przydatną komendę "
catch throw", która zatrzymuje program w momencie rzucenia wyjątku. W ten sposób można podglądnąć oryginalne zmienne na stosie.
#include <iostream>
void test() {
int a = 5;
throw std::exception();
}
int main() {
test();
return 0;
}
Program niespodziewanie zakończył swoje działanie.
terminate called after throwing an instance of 'std::exception'
what(): std::exception
The program has unexpectedly finished.
Deguggowanie za pomocą GDB.
$ g++ -g main.cpp
$ gdb a.out
(gdb) catch throw
Catchpoint 1 (throw)
(gdb) r
Starting program: /home/beru/cpp_throw_test/a.out
Catchpoint 1 (exception thrown), 0xb7f247c0 in __cxa_throw ()
from /usr/lib/i386-linux-gnu/libstdc++.so.6
(gdb) bt
#0 0xb7f247c0 in __cxa_throw () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#1 0x080486f8 in test () at main.cpp:5
#2 0x08048703 in main () at main.cpp:9
(gdb) f 1
#1 0x080486f8 in test () at main.cpp:5
5 throw std::exception();
(gdb) p a
$1 = 5
Brak komentarzy:
Prześlij komentarz