基本上标题说的是什么。我有一个功能:如何在运算符<上使用GDB设置断点?
bool operator< (... lhs, ... rhs)
我想打破。 “B运营商<(...)”给我的错误:
malformed template specification in command
我怎样才能阻止GDB从思维<是一个模板开门红?我也尝试通过行号设置断点,但是这个定义在头文件中,由于某种原因,GDB认为头文件中不存在行号。
GDB 6.8
基本上标题说的是什么。我有一个功能:如何在运算符<上使用GDB设置断点?
bool operator< (... lhs, ... rhs)
我想打破。 “B运营商<(...)”给我的错误:
malformed template specification in command
我怎样才能阻止GDB从思维<是一个模板开门红?我也尝试通过行号设置断点,但是这个定义在头文件中,由于某种原因,GDB认为头文件中不存在行号。
GDB 6.8
您可以首先打印所有出现的运算符<
,获取您感兴趣的函数的地址并在其上设置断点。
注:这种技术将工作,你的函数定义的,不论是在.h
或.cpp
文件,只要你使用-g
$ gdb test
(gdb) p 'operator <'
$1 = {bool (MyClass &, MyClass &)} 0x4009aa <operator<(MyClass&, MyClass&)>
(gdb) b *0x4009aa
Breakpoint 1 at 0x4009aa: file test.h, line 5.
(gdb) r
Starting program: /home/agururaghave/.scratch/gdb-test/test
Breakpoint 1, operator< (obj1=..., obj2=...) at test.cpp:6
6 friend bool operator < (MyClass &obj1, MyClass &obj2) {
我测试了用下面的代码g++
编译:
/* test.h */
#include <iostream>
class MyClass {
public:
friend bool operator < (MyClass &obj1, MyClass &obj2) {
std::cout << "operator <" << "\n";
return true;
}
};
/* test.cpp */
#include "test.h"
int main() {
MyClass myObj1;
MyClass myObj2;
bool result = myObj1 < myObj2;
std::cout << result << "\n";
return 0;
}
尝试把它放在单引号:
break 'operator<(Blah, Blah)'
您还可以使用TAB完成得到GDB来帮助你
如果不帮助你”您需要对操作员的签名更加具体,而不是说“......”,因为您忽略了问题的重要部分!
哦,我刚刚看到您使用的GDB 6.8即将庆祝其第5个生日......升级。 GDB 7在解析C++声明方面要好得多。
单引号不起作用,当我尝试tab完成时,我看到这个运算符函数甚至没有被GDB列出。让我做一些测试,看看它是否实际上正在使用...我希望我可以升级GDB,但我正在远程调试我没有root的服务器。 – sooniln 2013-03-08 19:58:09
好吧,我将定义移到了cpp文件中,并且能够通过行号设置断点,但仍然没有通过符号,与以前相同的错误。更大的问题似乎是,这个函数从来没有被调用,这就解释了为什么我的multiset被如此渲染...... – sooniln 2013-03-08 20:05:56
你不需要root安装gdb,只需将它安装在你的主目录并从那里运行 – 2013-03-08 20:17:03