【发布时间】:2018-09-12 14:34:54
【问题描述】:
使用 ASIO 的简单 tcp 客户端会导致调用 abort() 以进行调试构建。 Release 构建中的相同应用程序可以正常工作而不会引发错误。编译器是 Visual Studio 2017。
将调试器附加到应用程序不会提供任何附加信息。
下面显示了一个将端口作为命令行参数连接到服务器并立即断开连接的演示示例。
我有什么办法可以在调试版本中避免这个错误?
#include <memory>
#include <string>
#include <iostream>
#include "asio.hpp"
using asio::ip::tcp;
class Client {
std::unique_ptr<asio::io_service> io_service_ = nullptr;
std::unique_ptr<tcp::socket> sock_ = nullptr;
public:
Client() {
io_service_ = std::make_unique<asio::io_service>();
sock_ = std::make_unique<tcp::socket>(*io_service_);
}
void connect(std::string hostname, unsigned int port) {
auto resolver = tcp::resolver(*io_service_);
auto query = tcp::resolver::query(hostname, std::to_string(port));
auto endpoint_iter = resolver.resolve(query);
asio::connect(*sock_, endpoint_iter);
}
};
int main(int argc, char* argv[]) {
try {
auto port = std::stoi(argv[1]);
Client client;
client.connect("localhost", port);
} catch (std::exception& e) {
std::cout << "\n" << e.what();
}
}
【问题讨论】:
-
“将调试器附加到应用程序不会提供任何附加信息。”怎么没有?在
abort()处总是至少有一个堆栈跟踪。您甚至可以在库函数本身上设置断点,以防调试器捕获它为时已晚 -
@sehe 当我有 try-catch 块时没有跟踪,当我取出 try-catch 块时,我得到了跟踪 > sClient.exe!invoke_main() 第 79 行 C++ sClient.exe !__scrt_common_main_seh() 第 288 行 C++ sClient.exe!__scrt_common_main() 第 331 行 C++ sClient.exe!mainCRTStartup() 第 17 行 C++ kernel32.dll!00007ff95ae43034() 未知 ntdll.dll!00007ff95b071431() 未知 我不明白。
标签: visual-c++ boost-asio