我在 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/