2013-03-08 2 views
2

В основном, что говорится в названии. У меня есть функция:Как установить контрольную точку на операторе <с помощью GDB

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

, что бы я хотел прорвать. «Б оператор < (...)» дает мне ошибку:

malformed template specification in command 

Как я могу остановить GDB от мышления < шаблон нож? Я также попытался установить точку останова по номеру строки, но это определение находится в файле заголовка, и по какой-то причине GDB считает, что номер строки не существует в файле заголовка.

GDB 6,8

ответ

7

Вы можете сначала напечатать все вхождения оператора <, захватить адрес интересующей вас функции и установить на ней точку останова.

Примечание: Этот метод будет работать независимо от вашего определения функции в .h или .cpp файл до тех пор, как вы собрали с g++ использованием -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; 
} 
2

Попробуйте положить его в одинарные кавычки:

break 'operator<(Blah, Blah)' 

Вы можете также использовать TAB-завершение, чтобы GDB, чтобы помочь вам

Если это не поможет» Вам нужно будет более конкретно указать подпись оператора вместо того, чтобы говорить «...», так как вы опускаете важную часть вопроса!

О, я только что видел, что вы используете GDB 6.8, который собирается отпраздновать свой 5-й день рождения ... обновление. GDB 7 намного лучше разбирает объявления C++.

+0

Одиночные кавычки не работают, и когда я попытался выполнить табуляцию, я увидел, что это операторское функционирование даже не отображается вообще GDB. Позвольте мне сделать некоторое тестирование, чтобы проверить, действительно ли оно используется ... Я хочу, чтобы я мог обновить GDB, но я отлаживаю удаленно на сервере, на котором у меня нет root. – sooniln

+0

Хорошо, я переместил определения в файл cpp и смог установить точку останова по номеру строки, но все же не по символу, те же ошибки, что и раньше. Большая проблема, похоже, в том, что эта функция никогда не вызывается, что объясняет, почему мой мультимножество настолько эффективен ... – sooniln

+1

Вам не нужен root для установки gdb, просто установите его в свой домашний каталог и запустите его оттуда –

Смежные вопросы