C++ 使用通配符设置断点?

C++ 使用通配符设置断点?,c++,debugging,gdb,wildcard,breakpoints,C++,Debugging,Gdb,Wildcard,Breakpoints,我试图调试一个严重依赖继承的类。调试会话是乏味的,因为它涉及一个对象在链中的另一个对象上调用相同的函数。我浪费了很多时间去处理那些本可以更好地用在其他地方的无关代码 下面是一个简单的例子:我想使用通配符在类实例上设置断点,如bfoo::*。这样,当我感兴趣的东西进入作用域(如静态函数或成员函数)时,调试器将捕捉 这是一个困难的问题:参数化类:我想使用通配符在模板化类的成员函数上设置断点,如bfoo::bar。(真正的问题要比这严重得多,因为模板参数本身就是模板类) 虽然GDB似乎允许我设置一个,

我试图调试一个严重依赖继承的类。调试会话是乏味的,因为它涉及一个对象在链中的另一个对象上调用相同的函数。我浪费了很多时间去处理那些本可以更好地用在其他地方的无关代码

下面是一个简单的例子:我想使用通配符在类实例上设置断点,如
bfoo::*
。这样,当我感兴趣的东西进入作用域(如静态函数或成员函数)时,调试器将捕捉

这是一个困难的问题:参数化类:我想使用通配符在模板化类的成员函数上设置断点,如
bfoo::bar
。(真正的问题要比这严重得多,因为模板参数本身就是模板类)

虽然GDB似乎允许我设置一个,但调试器并没有停止(见下文)。它声称在将来的加载中设置断点。事实上,我使用了静态链接,符号已经存在了。将不会加载任何库

如何使用通配符设置断点


以及:

(gdb)rbreak CryptoPP::DL_EncryptionAlgorithm_Xor::SymmetricEncrypt
(gdb)r
启动程序:/home/cryptopp-ecies/ecies-test.exe
拂晓进攻!
[次1(进程5470)正常退出]
...
(gdb)rbreak CryptoPP::*::SymmetricEncrypt
(gdb)r
启动程序:/home/cryptopp-ecies/ecies-test.exe
拂晓进攻!
[次1(进程5487)正常退出]

您可以在以下语法中使用rbreak:

(gdb) rbreak ^CryptoPP::PK_EncryptorFilter::.*
见gdb男子:

编辑: 我做了一些调查,创建了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;
}
#包括
模板类MyTemplate{
公众:
只有一个oo;
void myfunc(){
printf(“debug\n”);
}
};
int main(){
MYMT模板;
mt.myfunc();
返回0;
}
然后在gdb中:

(gdb) rbreak MyTemplate<.*>::myfunc
Breakpoint 1 at 0x40055e: file main.cc, line 7.
void MyTemplate<int>::myfunc();
(gdb) r
(gdb)rbreak MyTemplate::myfunc
断点1位于0x40055e:文件main.cc,第7行。
void MyTemplate::myfunc();
(gdb)r

调试程序在查找要中断的点时没有问题。。。您需要尝试使用
*
而不是普通的通配符。

谢谢。硬的(C++和模板)没有乐趣。我更新了问题以包含结果。你确定没有忘记点:
CryptoPP::DL_EncryptionAlgorithm\u Xor::SymmetricEncrypt
是的,我没有使用点。手册上说这个点已经存在了。谢谢,这就解决了。这回答了你的问题吗?
#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) rbreak MyTemplate<.*>::myfunc
Breakpoint 1 at 0x40055e: file main.cc, line 7.
void MyTemplate<int>::myfunc();
(gdb) r