【问题标题】:different unexpected errors when building with -pg option使用 -pg 选项构建时出现不同的意外错误
【发布时间】:2017-09-30 13:26:14
【问题描述】:

我的主要任务是编写一个通过套接字传输大数据的工具。 我的代码背后的主要思想不是太复杂,所以我将给出以下伪代码:

alignas( 4 ) struct package :
  uint8_t type , is_eof , padding[ 2 ] ;
  uint32_t size , checksum ; 
  uint8_t data[ large_size ] ;

function send :
   read amount of data to the "package" ( with std::istream::read ) ; 
   form a "package" : load gcount() of read bytes, checksum, etc. 
                      ( hton* are used on this step ) ;
   send "package" ( sendall from beej's guide ) ;
   wait for approve package ;

function receive :
   receive a "package" ( recv with MSG_WAITALL ) ;
   unpack : calc checksum and check ( crc ), etc ;
   write data to ostream ( std::ostream::write ) ;
   send approve package ;

在常规构建 ( g++-5 ) 上,一切都按预期完美运行 - 发送方发送数据,接收方 接收、检查和发送响应。此外,由于我幼稚的基准 在 LAN 上,它的运行速度仅比通过 ftp 传输慢 1.5 倍。)

但是当我在 g++ 的选项中添加“-pg”标志时,在几个包接收器之后 开始接收带有垃圾的包裹。

有人知道发生了什么吗?

【问题讨论】:

    标签: c++ sockets gdb g++ profiling


    【解决方案1】:

    我不知道您是如何获得套接字的,所以这是基于我在 2003 年左右看到的类似问题的疯狂猜测:

    您有一些代码“有用地”关闭 Unix 文件描述符从 3 到 1024(或 4096,或 NOFILE 等)。然后将 FD 3 重用于套接字。

    提示:分析使用文件描述符。

    在我过去的类似问题中,在 FD 3 上打开的套接字正在发送所有与预期数据交错的分析数据。

    如果您没有打开它,请不要关闭它。

    【讨论】:

    • 好吧,我通过 POSIX 'socket' 获取套接字的描述符,而代码调用'close' 的唯一地方是包装器的析构函数。 “你有一些代码“有用地”关闭 Unix 文件描述符从 3 到 1024”我在哪里可以找到它。? (我已经有想法了,我检查一下)。
    • 正如我所说,这是一个猜测。将您的代码用于“关闭”。此类闭环经常出现在服务启动附近的后台程序、守护程序、双 fork() 代码中。
    猜你喜欢
    • 2018-12-29
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2013-07-06
    相关资源
    最近更新 更多