簡體   English   中英

Boost asio async_write_some泄漏?

[英]Boost asio async_write_some leaking?

我一直在搞一個使用boost :: asio進行UDP和SocketCAN通信的應用程序。 今天,我注意到了一些奇怪的東西-它正在泄漏內存!

所以我抓起了我的可信賴的工具包,其中包括

echo 0 $(awk '/Private/ {print "+", $2}' /proc/`pidof main`/smaps) | bc

和Allinea DDT,並開始診斷此問題。

我最后得到的是以下代碼段,它利用了boost :: asio :: posix :: basic_stream_descriptor作為基礎:

void Can::write(struct can_frame frame) {
  stream_.async_write_some(boost::asio::buffer(&frame, sizeof(frame)),
                           boost::bind(&Can::datSend, this)
  );
}

在這里,datSend只是一個空函數,可以對看門狗執行ping操作。 我也嘗試過

void Can::write(struct can_frame frame) {
  stream_.write_some(boost::asio::buffer(&frame, sizeof(frame)));
}

但是由於某種原因,這會導致異常(無效數據)。

該代碼的后端看起來像這樣:

boost::asio::io_service ioService_;
boost::asio::posix::basic_stream_descriptor<> stream_;

Constructor() : stream_(ioService_) {
  socketDescriptor_ = socket(PF_CAN, SOCK_RAW, CAN_RAW);

  struct timeval timeout {
      .tv_sec = 5,
      .tv_usec = 0
  };

  if (setsockopt(socketDescriptor_, SOL_SOCKET, SO_RCVTIMEO,
                 reinterpret_cast<char *>(&timeout),
                 sizeof(timeout)) < 0) {
    throw std::string("Error setting CAN socket timeout");
  }

  strcpy(interfaceRequest_.ifr_name, interfaceName.c_str());
  ioctl(socketDescriptor_, SIOCGIFINDEX, &interfaceRequest_);
  socketAddress_.can_family = AF_CAN;
  socketAddress_.can_ifindex = interfaceRequest_.ifr_ifindex;
  stream_.assign(socketDescriptor_);

  if (bind(socketDescriptor_, (struct sockaddr *)&socketAddress_,
           sizeof(socketAddress_)) < 0) {
    throw std::string("Error in socket bind");
  }

}

之后,我只運行ioservice,就是這樣:

void Can::iosThreadWorker() { ioService_.run(); }

我已經討論了很多stackoverflow主題以及boost文檔,但是似乎找不到為什么此函數會泄漏內存的原因。

Boost版本-1.60 G ++-6.30操作系統:Ubuntu 17.04

因此,我進行了更深入的研究,發現了關於boost.io_service的一些提示:

io_service.run()如果沒有工作要做,則完成-因此,通過運行它並發送更多要完成的異步工作,該工作尚未完成。

這源於一個問題,即有人翻轉了ioservice.run()和異步讀取回調分配以使代碼看起來更好-現在在運行之前沒有任何工作堆積,ioservice可以完成其工作並返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM