28 września 2013

[gdb] - debugowanie wyjątków w C++

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