c++ - GDB 断点在 asio socket->connect 调用后停止工作

标签 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::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 和异常调用。

关于c++ - GDB 断点在 asio socket->connect 调用后停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4562485/

相关文章:

c++ - 自定义列表类的初始值设定项列表构造函数

c++ - WinAPI - 无法点击按钮

c++ - ANN OPENCV 错误断言失败

linux - mmap2无法为线程分配堆栈,但在GDB下可以工作

gdb - 使用某种 gui 远程调试包含 gdb 的嵌入式系统

c++ - 如何判断模板类型是基本类型还是类

gdb - 使用 Qt Creator 时使 gdb 读取项目特定的 .gdbinit

c++ - Win-builds 与 MinGW-builds 之间的区别

mingw - 有没有一种方法可以在不安装MinGW的情况下运行使用MinGW编译的.exe?

opencv - 无法正确构建OpenCV + GStreamer(MinGW,Windows)