Установить точку останова с использованием подстановочных знаков?

Я пытаюсь отладить класс, который сильно зависит от наследования. Сеанс отладки утомителен, поскольку в нем один объект вызывает ту же функцию для другого объекта в цепочке. Я трачу много времени на пошаговое выполнение нерелевантного кода, который лучше было бы потратить в другом месте.

Вот простой: я хочу установить точку останова на экземпляре класса, используя подстановочный знак, например b Foo::*. Таким образом, когда интересующий меня материал входит в область видимости (например, статическая функция или функция-член), отладчик щелкает.

Вот самый сложный: параметризованный класс: я хочу установить точку останова для функции-члена шаблонного класса, используя подстановочный знак, например b Foo<*>::bar. (Настоящая проблема намного хуже, потому что параметры шаблона сами являются классами шаблона).

Хотя кажется, что GDB позволяет мне установить его, отладчик не останавливается (см. Ниже). Он утверждает, что устанавливает точку останова для будущих нагрузок. На самом деле я использовал статическое связывание, и символы уже присутствуют. Библиотеки загружаться не будут.

Как установить точку останова с помощью подстановочных знаков?


(gdb) b CryptoPP::PK_EncryptorFilter::*
Function "CryptoPP::PK_EncryptorFilter::*" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y

Breakpoint 2 (CryptoPP::PK_EncryptorFilter::*) pending.
(gdb) r
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn!
[Inferior 1 (process 5163) exited normally]

А также:

(gdb) rbreak CryptoPP::DL_EncryptionAlgorithm_Xor<*>::SymmetricEncrypt
(gdb) r
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn!
[Inferior 1 (process 5470) exited normally]
...

(gdb) rbreak CryptoPP::*::SymmetricEncrypt
(gdb) r
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn!
[Inferior 1 (process 5487) exited normally]

person jww    schedule 19.04.2015    source источник
comment
Отвечает ли это на ваш вопрос? Как разбить все функции, соответствующие узор?   -  person Ruslan    schedule 29.03.2020


Ответы (1)


Вы можете использовать rbreak в синтаксисе:

(gdb) rbreak ^CryptoPP::PK_EncryptorFilter::.*

См. Человека по gdb: https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

Редактировать:

Я провел небольшое расследование и создал main.cc следующим образом:

#include <cstdio>

template <class OnlyOne> class MyTemplate {
public:
    OnlyOne oo;
    void myfunc(){
       printf("debug\n");
    }
};


int main() {
   MyTemplate<int> mt;
   mt.myfunc();
   return 0;
}

Затем в gdb:

(gdb) rbreak MyTemplate<.*>::myfunc
Breakpoint 1 at 0x40055e: file main.cc, line 7.
void MyTemplate<int>::myfunc();
(gdb) r

У отладчика нет проблем с поиском точек разрыва ... Вам нужно попробовать .* вместо простого символа подстановки.

person W.F.    schedule 19.04.2015
comment
Спасибо. Никаких радостей на сложном (C ++ и шаблоны). Я обновил вопрос, чтобы включить результат. - person jww; 19.04.2015
comment
Вы уверены, что не забыли точку: CryptoPP::DL_EncryptionAlgorithm_Xor<.*>::SymmetricEncrypt - person W.F.; 19.04.2015
comment
Да, я не использовал точку. На страницах руководства сказано, что точка уже присутствует. Спасибо, что решили это. - person jww; 19.04.2015