2

基本的にタイトルが言うこと。私は機能を持っています:

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

中断したいこと。'b operator <(...)'はエラーを出します:

malformed template specification in command

<がテンプレートオープナーであるとGDBが考えないようにするにはどうすればよいですか?行番号でもブレークポイントを設定しようとしましたが、この定義はヘッダーファイルにあり、何らかの理由でGDBは行番号がヘッダーファイルに存在しないと考えています。

GDB 6.8

4

2 に答える 2

6

最初に、出現するすべての演算子<を出力し、目的の関数のアドレスを取得して、ブレークポイントを設定することができます。

注:この手法は、を使用してコンパイルした場合に限り、関数定義がファイルにある.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補完を使用して、GDBを支援することもできます

それでも問題が解決しない場合は、質問の重要な部分を省略しているため、「...」と言うのではなく、オペレーターの署名についてより具体的にする必要があります。

ああ、5歳の誕生日を迎えようとしているGDB6.8を使用しているのを見たばかりです...アップグレード。GDB 7は、C++宣言の解析にはるかに優れています。

于 2013-03-08T19:51:40.450 に答える