如何在来自通过本机消息传递 API 发送的 Web 扩展 JSON 的消息长度的 fread 中调试 C 中的错误?

问题描述

下面的 C 代码用于读取从 Web 浏览器的本机消息传递 API 发送的 JSON 消息,根据 Firefox MDN,“以包含本机字节顺序的消息长度的 32 位值开头”。

>

其中有超过 5000 个已正确传递,但每次在 while 循环中都有两个特定的失败,这似乎意味着无法读取指示 JSON 字符串字节长度的前缀。永远不会进入 while 循环。有几次,几个 JSON 消息失败了,但随后又成功了。但是这两个每次都失败了。

每条消息的 JSON 都非常相似,唯一的区别是数据量。结构和内容类型相同。每次失败的两个既不是最大的也不是最小的。在扩展端,这两个一致失败传递的 JSON 的 JSON.stringify().length 是 6859 和 6747。

JSON 字符串可以打印到浏览器控制台,看起来不错。如果它以某种方式格式错误,我认为消息传递 API 将根本无法发送它,更有可能的是,JS 代码将在尝试发送之前失败。

我知道消息从扩展发送到 C 代码没有错误,因为扩展在发送之前将消息写入控制台并指示正在执行发送。然后,扩展表明与本机应用程序的连接端口已关闭。在整个 C 代码中都有错误捕获以将错误消息返回给扩展。但是,错误似乎发生在消息长度的 fread 处,因为从未向扩展返回任何错误。此外,当错误从 C 代码发送到扩展时,连接端口不会关闭。仅在发生未捕获的错误或 C 代码返回错误的 JSON 消息时才关闭;但是,如果出现错误的 JSON 消息,扩展会在关闭端口之前将该错误作为格式错误的 JSON 写入控制台。这些都没有发生。

如何测试 C 代码中发生的事情?本机消息传递 API 设置了大小前缀,我不知道可以在 C 代码中检查什么,因为它在读取消息长度时失败。

代码块为 xout: 1,l: 16134,s: 4JSON.stringify().length 的 JSON 字符串写入 16116,为 xout: 0,l: 16242,s: 4JSON.stringify().length 的 JSON 字符串写入 6747 }} 对于一个失败的人。

JSON 字符串中可能有一些转义字符。也许,JSON.stringify().length 会计算它们而 fread 不会,作为对第一个字符串长度差异的解释。但是,失败的第二个字符串的 fread 长度是 JSON.stingify().length 的两倍多。这是否表示本地消息前缀中存在错误

谢谢。


现在可以使用了。我应该说我在 Windows 操作系统中工作,以下解决了这个问题。这已经多次咬我的背面,我一直忘记它,直到我浪费了几个小时的时间。我为 stdout 设置了它,但认为 stdin 不需要它。就是 Windows 中的 /r/n issue

我不明白为什么它会影响二进制值的读取,但总的来说我不太了解它。

   // Set "stdin" to have binary mode:
   if( _setmode( _fileno( stdin ),_O_BINARY ) == -1 )
      perror( "Cannot set mode" );
   else 
     send_response( "{\"d\":\"stdin successfully changed to binary mode.\"}" );

   // Set "stdout" to have binary mode. Without this code for Windows OS,a response having a length that is a multiple of 256 plus 10 will fail.
   if ( _setmode( _fileno( stdout ),_O_BINARY ) == -1 )
     perror( "Cannot set mode" );
   else
     send_response( "{\"d\":\"stdout successfully changed to binary mode.\"}" );

int listen( void )
  {
    int x,i = 0,rc;
    uint32_t msg_len;
    while ( ( x = fread( &msg_len,sizeof msg_len,1,stdin ) ) == 1 )
      {  
        char *buf = malloc( msg_len ); 
        if ( !buf ) 
          {
          }
        else if ( fread( buf,sizeof *buf,msg_len,stdin ) != msg_len )
          {
          }
        else
          {
            // Success send to routing function.
            printf( "{\"xout\":%d,\"l\":%lu,\"s\":%lu}",x,(unsigned long)msg_len,sizeof msg_len );
          }
        fflush( stdout );
        // cleanup
        free( buf );
      }
    printf("{\"xout\":%d,sizeof msg_len );
    return 0;
  } // close listen

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)