【发布时间】:2010-12-30 12:12:48
【问题描述】:
我在 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 进入更底层的系统调用时会出现问题。
【问题讨论】:
-
你在构建 boost 时给了 bjam 什么论据?
-
这些:--address-model=32 variant=debug --debug-symbols=on --toolset=gcc
-
需要考虑的一些事情:您是否使用异步
connect?如果没有,调用connect的线程可能被阻塞了。当时是否有其他线程处于活动状态(未阻塞)? -
我这里是故意使用同步连接的,我觉得这样更简单。只有一个活动线程确实被阻塞了,但是当它被释放时,执行继续,但断点不起作用。
标签: c++ gdb mingw eclipse-cdt boost-asio