GDB: предупреждение: множественные точки останова были установлены на перегруженных методах - PullRequest
5 голосов
/ 07 сентября 2011
anisha@linux-dopx:~> g++ -Wall -pedantic breakpoints.cpp -g
anisha@linux-dopx:~> gdb a.out
(gdb) b X::X
Breakpoint 1 at 0x400ac1: file breakpoints.cpp, line 14.
Breakpoint 2 at 0x400aa0: file breakpoints.cpp, line 9.
warning: Multiple breakpoints were set.
Use the "delete" command to delete unwanted breakpoints.
(gdb)

Как установить точку останова? на конструкторе по умолчанию, так что GDB не создает ненужных точек останова на его перегруженные аналоги?

Или это проблема с GDB, которую он ожидает пользователи, чтобы удалить его беспорядок? Или я упускаю точку?

РЕДАКТИРОВАТЬ 1.

Для следующего кода:

class X
{
    public:
        X   () 
        {
            std :: cout << "\nIn the default constructor";
        }

        X   (int) 
        {
            std :: cout << "\nIn the parameterized constructor";
        }

        ~X () {}
};

Я пытался:

(gdb) b X:: X (11)
the class X does not have any method named X (11)
Hint: try 'X:: X (11)<TAB> or 'X:: X (11)<ESC-?>
(Note leading single quote.)
Make breakpoint pending on future shared library load? (y or [n]) 

Не помогло!

РЕДАКТИРОВАТЬ 2.

Благодаря osgx , работают следующие:

(gdb) b X::X(int)
Breakpoint 5 at 0x400ac1: file breakpoints.cpp, line 14.
(gdb) b X::X()
Breakpoint 6 at 0x400aa0: file breakpoints.cpp, line 9.
(gdb) 

1 Ответ

6 голосов
/ 07 сентября 2011

Я думаю, это нормально.Некоторые ABI сгенерируют два конструктора для класса.Когда вы спрашиваете b X::X, GDB обнаружит оба конструктора и установит две точки останова.(Извините, это не ваш случай)

«Было установлено несколько точек останова».Предупреждение также может быть дано для перегруженных методов (это ваш случай): http://www.delorie.com/gnu/docs/gdb/gdb_36.html

Некоторые языки программирования (особенно C ++) позволяют определять одно имя функции несколько раз, для применения в разных контекстах.,Это называется перегрузкой.Когда имя функции перегружено, `break function 'недостаточно, чтобы указать GDB, где вы хотите установить точку останова.

Для таких методов вы можете выбрать один метод, набрав его типы:

функция прерывания (типы)

Обновление: согласно тому же документу, GDB должен попросить пользователя выбрать некоторые из перегруженных методов:

GDB предлагает вамменю пронумерованных вариантов для различных возможных точек останова, и ждет вашего выбора с подсказками >'. The first two options are always [0] cancel 'и `[1] all'.Ввод 1 устанавливает точку останова при каждом определении функции, а ввод 0 прерывает команду прерывания без установки каких-либо новых точек останова.

Например, следующий отрывок сеанса показывает попытку установить точку останова в перегруженном символе String::после.Мы выбираем три конкретных определения имени этой функции:

(gdb) b String::after
[0] cancel
[1] all
[2] file:String.cc; line number:867
[3] file:String.cc; line number:860
[4] file:String.cc; line number:875
[5] file:String.cc; line number:853
[6] file:String.cc; line number:846
[7] file:String.cc; line number:735
> 2 4 6
Breakpoint 1 at 0xb26c: file String.cc, line 867.
Breakpoint 2 at 0xb344: file String.cc, line 875.
Breakpoint 3 at 0xafcc: file String.cc, line 846.
Multiple breakpoints were set.
Use the "delete" command to delete unwanted
 breakpoints.
(gdb)

UPDATE1: http://sourceware.org/gdb/onlinedocs/gdb/Ambiguous-Expressions.html#Ambiguous-Expressions говорит, что это меню можно включать и выключать (по умолчанию выключено):

установить несколько символов mode

Этот параметр позволяет настроить поведение отладчика, когда выражение является неоднозначным.По умолчанию режим установлен на все .Если команда, с которой используется выражение, допускает более одного выбора, то GDB автоматически выбирает все возможные варианты.

Когда для режима установлено значение ask , отладчик всегда использует меню при обнаружении неоднозначности.

Наконец, когда для режима установлено значение cancel отладчик сообщает об ошибке из-за неоднозначности, и команда прерывается.

...