使用通配符设置断点?
Set breakpoint using wildcards?
我正在尝试调试严重依赖继承的 class。调试会话很乏味,因为它涉及一个对象在链中的另一个对象上调用相同的函数。我浪费了很多时间在不相关的代码上,这些代码本可以用在其他地方更好。
这是简单的:我想使用通配符在 class 实例上设置断点,例如 b Foo::*
。这样,当我感兴趣的东西进入作用域时(比如静态函数或成员函数),调试器就会捕捉到。
这里是难点:参数化 class:我想使用通配符在模板化 class 的成员函数上设置断点,例如 b Foo<*>::bar
。 (实际问题比这更糟糕,因为模板参数本身就是模板classes)。
虽然 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]
您可以在语法中使用 rbreak:
(gdb) rbreak ^CryptoPP::PK_EncryptorFilter::.*
查看 gdb man: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
调试器可以轻松找到中断点...您需要尝试 .*
而不是普通的通配符。
我正在尝试调试严重依赖继承的 class。调试会话很乏味,因为它涉及一个对象在链中的另一个对象上调用相同的函数。我浪费了很多时间在不相关的代码上,这些代码本可以用在其他地方更好。
这是简单的:我想使用通配符在 class 实例上设置断点,例如 b Foo::*
。这样,当我感兴趣的东西进入作用域时(比如静态函数或成员函数),调试器就会捕捉到。
这里是难点:参数化 class:我想使用通配符在模板化 class 的成员函数上设置断点,例如 b Foo<*>::bar
。 (实际问题比这更糟糕,因为模板参数本身就是模板classes)。
虽然 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]
您可以在语法中使用 rbreak:
(gdb) rbreak ^CryptoPP::PK_EncryptorFilter::.*
查看 gdb man: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
调试器可以轻松找到中断点...您需要尝试 .*
而不是普通的通配符。