C++ asio套接字之后GDB断点停止工作->;接通电话

C++ asio套接字之后GDB断点停止工作->;接通电话,c++,gdb,mingw,eclipse-cdt,boost-asio,C++,Gdb,Mingw,Eclipse Cdt,Boost Asio,我在Windows上使用Eclipse+Mingw+Boost 当调试器在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::re

我在Windows上使用Eclipse+Mingw+Boost

当调试器在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正确地停止在main中,我可以安全地单步执行我的代码,直到socket->connect调用,在此之后,我失去了对执行的所有控制,程序继续执行,直到退出。此行之后的所有断点都将被完全忽略。我在gdb日志中没有看到有用的错误消息

我正在使用最新版本的Mingw、Boost和Eclipse。我使用同一个编译器编译了我的代码和boost,两者都启用了调试符号


编辑:我还可以安全地通过boost代码一路进入调用,因此我确信当gdb进入较低级别的系统调用时,问题就会出现。

这个问题似乎暂时得到了解决。在Windows下,在Eclipse中使用gdb调试其他穷人的有用提示:

1) 注意表达方式。gdb似乎在每一步都试图解释这些。在这里提供错误的值,您将有一个非常不稳定的调试体验

2) 印刷时要小心。在我的例子中,通过查看gdb日志,我注意到gdb实际上会在所需的断点处停止,但Eclipse不会做出反应。问题是我的cout输出不知何故被打印在gdb输出中,因为这是Eclipse从gdb检索信息的方式,它无法理解断点实际上被击中了,只是一直在那里等待


3) 尽量不要做太多的步进。尤其是通过socket->connect和异常调用。

这个问题似乎暂时得到了解决。在Windows下,在Eclipse中使用gdb调试其他穷人的有用提示:

1) 注意表达方式。gdb似乎在每一步都试图解释这些。在这里提供错误的值,您将有一个非常不稳定的调试体验

2) 印刷时要小心。在我的例子中,通过查看gdb日志,我注意到gdb实际上会在所需的断点处停止,但Eclipse不会做出反应。问题是我的cout输出不知何故被打印在gdb输出中,因为这是Eclipse从gdb检索信息的方式,它无法理解断点实际上被击中了,只是一直在那里等待

3) 尽量不要做太多的步进。特别是通过套接字->连接和异常调用

2) 印刷时要小心。在我的例子中,通过查看gdb 日志,我注意到gdb实际上在所需的断点处停止, 但Eclipse没有反应。问题是我不知怎么地无法输出 在gdb输出中打印,因为Eclipse就是这样检索的 来自gdb的信息,它无法理解断点是 真的打了,就一直等在那里

这对我来说也是一个问题——将
设置新的控制台到
中。gdbinit为我解决了这个问题

2) 印刷时要小心。在我的例子中,通过查看gdb 日志,我注意到gdb实际上在所需的断点处停止, 但Eclipse没有反应。问题是我不知怎么地无法输出 在gdb输出中打印,因为Eclipse就是这样检索的 来自gdb的信息,它无法理解断点是 真的打了,就一直等在那里


这也是我面临的问题-将
设置新的控制台在
中。gdbinit为我修复了它。

构建boost时,您给bjam的参数是什么?这些:--address model=32 variant=debug--debug symbols=on--toolset=gcc需要考虑的一些事情:您是否使用异步
连接
?否则,调用
connect
的线程可能被阻塞。当时是否有其他线程处于活动状态(未被阻止)?我在这里故意使用同步连接,我认为这样更简单。只有一个活动线程会被阻塞,但当它被释放时,执行会继续,但断点不起作用。在构建boost时,您给bjam的参数是什么?这些:--address model=32 variant=debug--debug symbols=on--toolset=GCC需要考虑的一些事情:您是否使用async
connect
?否则,调用
connect
的线程可能被阻塞。当时是否有其他线程处于活动状态(未被阻止)?我在这里故意使用同步连接,我认为这样更简单。只有一个活动线程会被阻塞,但当它被释放时,执行会继续,但断点不起作用。