Точка останова GDB та же функция появляется больше раз - PullRequest
1 голос
/ 11 мая 2009

Используя gdb, я столкнулся со странной проблемой: существует метод, который появляется три раза:

(gdb) b Logger::Logger
[0] cancel
[1] all
[2] Logger at src/Logger.cpp:52
[3] Logger at src/Logger.cpp:52
[4] Logger at src/Logger.cpp:52

Из того факта, что все три экземпляра находятся в строке 552 файла Logger.cpp, можно сделать вывод, что они фактически ссылаются на один и тот же метод. Что это означает? Неужели конструктор Logger :: Logger трижды случайно попал в двоичный файл или это ошибка GDB?

Ответы [ 3 ]

5 голосов
/ 11 мая 2009

Последние версии GCC (и многих других компиляторов) создают несколько версий конструкторов и деструкторов.

В GDB была ошибка, из-за которой не удавалось установить точку останова во всех версиях, что привело к тому, что ваша точка останова вообще не срабатывает. Теперь, с исправленной ошибкой GDB, вы получаете несколько точек останова.

Выберите all, затем выполните info break и обратите внимание, что адреса всех трех точек останова различны и фактически имеют разные функции.

0 голосов
/ 14 июля 2009

Вы можете использовать «информационный разрыв» и отключить, включить, возможно, точку останова, установленную на одну и ту же строку .... однако, вы также должны знать, шаг против шага (stepi выполнит одну инструкцию машинного кода, а не по источнику уровень, который делает шаг).

Вы также можете c #, чтобы продолжить определенное количество раз, чтобы пройти эту точку останова ... так что если это 1 точка останова в цикле, которая оценивается 3 раза, вы идете c 3, и вы пройдете это петулярная петля ...

0 голосов
/ 11 мая 2009

Либо метод был встроен, потому что gcc думал, что он будет работать лучше, либо он использовался в шаблоне, который был создан более чем одним способом. Любой путь может привести к нескольким версиям в исполняемом двоичном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...