Точки останова GDB перестают работать после asio socket-> connect call - PullRequest
1 голос
/ 30 декабря 2010

Я использую Eclipse + Mingw + Boost в Windows.

У меня возникает проблема, когда отладчик получает в Eclipse этот фрагмент кода:

int YarpInterface::connect_to_port(std::string ip, std::string port, tcp::socket* socket)
{    
    boost::asio::io_service io_service;
    tcp::resolver resolver(io_service);
    tcp::resolver::query query(boost::asio::ip::tcp::v4(), ip, port);
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    tcp::resolver::iterator end;
    boost::system::error_code error = boost::asio::error::host_not_found;

    while (error && endpoint_iterator != end)
    {
       socket->close();
       socket->connect(*endpoint_iterator++, error);
    }
    if (error)
    {
       throw boost::system::system_error(error);
    }
    return true;
}

Когда я начинаю отладку, gdb корректно останавливается внутри основного, я могу безопасно пошагово выполнить свой код до вызова socket-> connect, после чего я теряю контроль над выполнением, и программа просто продолжает выполняться до это выходит. Все точки останова после этой строки полностью игнорируются. Я не вижу полезных сообщений об ошибках в логах GDB.

Я использую последнюю версию Mingw, Boost и Eclipse. Я скомпилировал свой код и ускорился, используя тот же компилятор, оба с включенными символами отладки.

Редактировать: я также могу безопасно входить в вызов через буст-код, поэтому я совершенно уверен, что проблема возникает, когда GDB достигает системных вызовов более низкого уровня.

Ответы [ 2 ]

1 голос
/ 30 декабря 2010

Проблема, похоже, решена на данный момент. Полезные советы для отладки других бедных душ с помощью GDB в Eclipse под Windows:

1) Будьте ОЧЕНЬ осторожны с выражениями (Watch). Кажется, что GDB пытается интерпретировать это на каждом шагу. Введите здесь неправильные значения, и у вас будет очень нестабильный опыт отладки.

2) Будьте осторожны с печатью. В моем случае, просматривая журналы GDB, я заметил, что GDB действительно останавливается на требуемой точке останова, но Eclipse не реагирует. Проблема заключалась в том, что мой вывод cout каким-то образом был напечатан в выводе gdb, так как именно так Eclipse извлекает информацию из gdb, он не мог понять, что точка останова была фактически достигнута, и просто ждал там вечно.

3) Старайтесь не делать слишком много шагов. Особенно через сокет-> соединение и вызовы исключений.

0 голосов
/ 07 февраля 2014

2) Будьте внимательны при печати.В моем случае, просматривая журналы GDB, я заметил, что GDB действительно останавливается на требуемой точке останова, но Eclipse не реагирует.Проблема заключалась в том, что мой вывод cout каким-то образом печатался в выводе gdb, так как именно так Eclipse извлекает информацию из gdb, он не мог понять, что точка останова была фактически достигнута, и просто ждал там вечно.* Это также было проблемой для меня - установка set new-console on в .gdbinit исправила это для меня.

...