本文目录,首先总结问题,然后案例还原。

总结:

问题的根本在于boost.asio作为header-only库,运行程序与动态库之间容易因为版本错配而产生运行期莫名其妙的问题。

cpprestsdk使用boost-1.53编译了动态库,运行程序通过cmake找库boost-1.53,但同时cmake_module_path包含了boost-1.7x的cmake帮助模块,致使程序实际却使用了boost-1.7x包含目录的配置,boost-1.53的库目录配置。

由于boost.asio是header-only库,cpprestsdk.so按boost-1.53方式访问io_service,并编译进库;运行程序却按boost-1.7x方式访问io_service。

由于程序整体(包括cpprestsdk.so)使用到的boost.asio的函数接口,两个版本的boost.asio并没有不一致,所以编译没有发生问题。但是io_service的结构却不同,编译没有发生问题,却不会被人发现。因此在运行期间,程序按boost-1.7x的结构定义创建io_service,cpprestsdk却按boost-1.53的结构定义访问。如果是发生了SIGSEGV一类内存访问越界,还容易发现,但却没有触发,只是变量在内存布局位置不同,而问题转移到其它函数,这些函数因为依赖io_service的变量而因为访问不到正确的值,触发参数错误。

正是因为上述原因,cpprestsdk不能正确读出io_service的epoll_fd_,从而编译在cpprestsdk.so的部分boost.asio代码在操作epoll时失败,也就是将22号errno抛出异常std::invalid_argument。

案例:

不要去企图调试pplx。

场境,cpprestsdk中的pplx只是ppl的一个修剪版,功力只有几成,而且没有timer,timer是另一个名为Asynchronous Agents Lib的类。所以只能使用boost.asio提供的timer。但是一旦代码加入了boost.asio的timer,http_listen.open().wait()就永远地抛“open: Invalid argument”。本例的平台环境是 10cores centos7。

调试开始:

线程抛异常。

一共有42个线程。

由http_listener.open().wait()抛出异常的backtrace。

不要去调试pplx,企图单步进去分析。open()异步到thread_pool,wait()阻塞等待task<>结果,然后将错误抛出异常。

也不要去调试cpprestsdk,你会接受一系列task的洗礼,无功而返。

根据异常信息分析,类型是boost::system::system_error,也就是系统调用,open函数报参数错误?socket是用socket()而不是open()。

断socket()分析。

上两图,主线程,正在wait;线程41正执行open的任务操作。线程41是什么?

线程41是由boost.asio库的threadpool创建的线程,运行io_service::run()的。为什么有40个线程,每个core创建了4个线程。

最后出现了我们的关键字“listener"。

可惜的是,socket()并没有失败,成功创建了fd:6的socket。

然后一波跟踪后,发现eventpoll的文件描述符有问题。

fd: 1是我们熟知的stdout,故一定出错。是谁手欠去将 epoll_fd_改掉了。只好在下次启动时,断epoll_create,找到epoll_fd_地址进行监视。但是让人崩溃的是,监视这个epoll_fd_,程序却直奔抛异常。

在几乎断线索的情况下,反过来一想epoll_fd_为什么就没有被访问呢,也就是说,我断的epoll_fd_,不是执行代码看到epoll_fd_,原因只有一个可能,我俩眼里的 io_service西施压根不是同一时空的。一查CMakeFiles里的CXX_includes发现,我的程序原来在使用boost-1.7x,我编译的cpprestsdk在使用boost-1.53,尽管我强调了find_package(Boost 1.53 REQUIRED),无奈CMAKE_MODULE_PATH包含了boost-1.7的帮助cmake却不知道。

事实上,这个错误浪费了不止上面贴出的过程的时间。因为在开始没有头绪的时候,还要先排除boost::asio timer对cpprestsdk.so的影响,毕竟是加了它才出问题。还有痛苦的pplx异步任务跟踪,徒劳无功。上面的案例是归纳修正思路后,案例重演调试,也就是几步,因为我以经知道问题所在,方向还怎么走到清楚。实际上就一yuan大头,浪费了多少时间。

cpprestsdk同时使用boost.asio,acceptor就一直报Invalid argument。的更多相关文章

  1. boost asio acceptor 构造

    boost::asio::io_service io_svc; boost::asio::ip::address_v4 lis_ip; // 默认监听本机所有IP boost::asio::ip::t ...

  2. BOOST.Asio——Tutorial

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

  3. Boost.Asio的使用技巧

    基本概念 Asio proactor I/O服务 work类 run() vs poll() stop() post() vs dispatch() buffer类 缓冲区管理 I/O对象 socke ...

  4. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  5. 01--c实现基础客户端和服务端与c++ boost.asio实现对比

    c实现服务端和客户端交互: 学习查阅的博客: https://blog.csdn.net/u011068702/article/details/54380259 https://blog.csdn.n ...

  6. c++ boost asio库初学习

    前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考. 同步server: // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します. ...

  7. 如何在多线程leader-follower模式下正确的使用boost::asio。

    #include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...

  8. BOOST.Asio——Overview

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

  9. boost asio sync

    Service: #include<boost/asio.hpp> #include<boost/thread.hpp> #include<iostream> #i ...

随机推荐

  1. D - Silver Cow Party J - Invitation Cards 最短路

    http://poj.org/problem?id=3268 题目思路: 直接进行暴力,就是先求出举行party的地方到每一个地方的最短路,然后再求以每一个点为源点跑的最短路. 还有一种方法会快很多, ...

  2. FPGA代码优化方法和准则

  3. JDBC14 ORM03 JavaBean封装

    Javabean对象封装一条信息(推荐) 让JavaBean的属性名和类型尽量和数据库保持一致 一条记录对应一个对象,将这些查询到的对象放到容器中(List) 表信息如下 List封装多条信息 Con ...

  4. vue项目中使用bpmn-流程图xml文件中节点属性转json结构

    内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...

  5. java ->网络通信协议(UDP协议、TCP协议)

    网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规 ...

  6. c# 贪吃蛇小游戏

    ------------恢复内容开始------------ 新手学习c# 在博客园上看到后自己模仿打出来的第一个程序  开心,纪念一下 bean :食物类 block :蛇块类 snake :蛇类 ...

  7. 实战!我用 Wireshark 让你“看得见“ TCP

    每日一句英语学习,每天进步一点点: 前言 为了让大家更容易「看得见」 TCP,我搭建不少测试环境,并且数据包抓很多次,花费了不少时间,才抓到比较容易分析的数据包. 接下来丢包.乱序.超时重传.快速重传 ...

  8. 6-JVM常用工具和优化

    JVM 常用工具和优化 JDK 自带的 jconsole jvisualvm 三方的工具 arthas 调优关注点(内存.GC): 内存 MAT XElephant 在线:perfma GC 拿到GC ...

  9. npm WARN enoent ENOENT: no such file or directory

    https://github.com/visionmedia/debug/issues/261

  10. centos7安装后不能连接外网

    测试外网: 1,测访问外网能力:curl -l http://www.baidu.com 2,测访问外网能力:wget http://www.baidu.com 注:ping命令不一定能正确反映系统的 ...