2

基本上就是标题所说的。我有一个功能:

bool operator< (... lhs, ... rhs)

我想打破。'b operator<(...)' 给了我错误:

malformed template specification in command

如何阻止 GDB 认为 < 是模板开启器?我也尝试按行号设置断点,但是这个定义在头文件中,并且由于某种原因,GDB 认为头文件中不存在行号。

GDB 6.8

4

2 回答 2

6

您可以首先打印所有出现的 operator <,获取您感兴趣的函数的地址并在其上设置断点。

注意:只要您使用 using 编译,无论您的函数定义是否在.h或文件中,此技术都可以使用.cppg++-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 ) {

我使用以下代码进行了测试:

/* 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;
}
于 2013-03-08T20:08:12.637 回答
2

尝试将其放在单引号中:

break 'operator<(Blah, Blah)'

您也可以使用 TAB-completion 来让 GDB 帮助您

如果这没有帮助,您需要更具体地说明操作员的签名,而不是说“...”,因为您忽略了问题的重要部分!

哦,我刚刚看到您正在使用即将庆祝其 5 岁生日的 GDB 6.8 ......升级。GDB 7 在解析 C++ 声明方面要好得多。

于 2013-03-08T19:51:40.450 回答