如何在GDB中设置operator<的断点

3
基本上就是标题所说的。我有一个函数:
bool operator< (... lhs, ... rhs)

我想要打破的是“b operator<(...)'”这个代码行。它给我报错了:
malformed template specification in command

如何让GDB不将“<”视为模板打开符号?我已尝试通过行号设置断点,但该定义位于头文件中,由于某种原因,GDB认为在头文件中该行号不存在。
GDB 6.8
2个回答

7
您可以先打印所有出现过的运算符<,获取您感兴趣的函数地址并在其上设置断点。
注意:只要你使用g++编译并使用了-g选项,不管您的函数定义在.h文件还是.cpp文件中这种技术都能起作用。
$ 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;
}

2
尝试使用单引号包裹起来:

尝试使用单引号包裹起来:

break 'operator<(Blah, Blah)'

您也可以使用TAB键补全功能让GDB帮助您

如果这没有帮助到您,您需要更具体地描述运算符的签名而不是仅仅说“...”,因为您省略了问题的重要部分!

哦,我刚刚看到您正在使用即将庆祝第五个生日的GDB 6.8 ... 建议您升级。GDB 7在解析C++声明方面更加出色。


单引号不起作用,当我尝试使用制表符自动完成时,我发现GDB根本没有列出这个运算符函数。让我进行一些测试,看看它是否真的被使用了...我希望我能升级GDB,但我正在远程调试一个我没有root权限的服务器。 - sooniln
好的,我把定义移到了cpp文件中,并且能够通过行号设置断点,但仍然无法通过符号设置断点,与之前相同的错误。更大的问题似乎是这个函数从未被调用,这就解释了为什么我的multiset出了问题... - sooniln
1
你不需要root权限安装gdb,只需将其安装在你的home目录中,然后从那里运行即可。 - Jonathan Wakely

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接