Я пытаюсь отладить класс, который сильно зависит от наследования. Сеанс отладки утомителен, поскольку в нем один объект вызывает ту же функцию для другого объекта в цепочке. Я трачу много времени на пошаговое выполнение нерелевантного кода, который лучше было бы потратить в другом месте.
Вот простой: я хочу установить точку останова на экземпляре класса, используя подстановочный знак, например 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]