GDB: точка останова при вызове деструктора определенного объекта

В моем приложении я получаю ошибку SIGSEGV после попытки доступа к полю внутри указателя виджета. Этот виджет взят из сторонней библиотеки. Я точно знаю точку, где кидается сигнал. Я хочу знать, был ли в этот конкретный момент указатель «этот» неисправного виджета удален или нет, и когда это произошло.

Итак, идея состоит в том, чтобы установить точку останова в месте, где я знаю, что мой объект действительно существует, и здесь возникает мой вопрос, скажем gdb: «прерываться, когда вызывается деструктор этого конкретного «этого» указателя». Как я могу сказать gdb сделать это?

В таком случае a может знать, был ли удален объект до подачи сигнала, а также где и почему этот объект был удален (чтобы исправить ситуацию).


person Peregring-lk    schedule 01.04.2016    source источник


Ответы (1)


Как я могу сказать gdb сделать это?

Используйте условную точку останова. Пример:

cat -n t.cc
     1  struct Foo {
     2    ~Foo() {}
     3  };
     4  
     5  Foo *af1, *af2;
     6  int main()
     7  {
     8    Foo f1;
     9    af1 = &f1;
    10    {
    11      Foo f2;
    12      af2 = &f2;
    13    }
    14  }

g++ -g t.cc && gdb -q ./a.out

(gdb) b 12
Breakpoint 1 at 0x400500: file t.cc, line 12.
(gdb) r
Starting program: /tmp/a.out 

Breakpoint 1, main () at t.cc:12
12      af2 = &f2;
(gdb) p &f2
$1 = (Foo *) 0x7fffffffdc9f
(gdb) p &f1
$2 = (Foo *) 0x7fffffffdc9e
(gdb) b 'Foo::~Foo()' if this == 0x7fffffffdc9f
Breakpoint 2 at 0x400532: file t.cc, line 2.
(gdb) c
Continuing.

Breakpoint 2, Foo::~Foo (this=0x7fffffffdc9f, __in_chrg=<optimized out>) at t.cc:2
2     ~Foo() {}
(gdb) bt
#0  Foo::~Foo (this=0x7fffffffdc9f, __in_chrg=<optimized out>) at t.cc:2
#1  0x0000000000400517 in main () at t.cc:12
(gdb) c
Continuing.
[Inferior 1 (process 121877) exited normally]

Вуаля: точка останова сработала при уничтожении f2, но не при уничтожении f1.

person Employed Russian    schedule 01.04.2016
comment
Есть ли способ установить имя для каждой конкретной точки останова? Потому что я установил точки останова для трех разных объектов, и при вызове деструкторов я не знаю параметра this. - person Peregring-lk; 01.04.2016
comment
@ Peregring-lk Я не знаю, как давать имена точкам останова, но вы можете использовать commands, чтобы добавить список команд, которые будут выполняться при попадании в точку останова, включая что-то вроде output "destructor for objectA has been called.\n". - person Mark Plotnick; 03.04.2016