【问题标题】:sigsegv Using MessageDifferencer on proto messagessigsegv 在原始消息上使用 MessageDifferencer
【发布时间】:2020-08-04 18:30:20
【问题描述】:

我是一个新手,试图将 google protobuf 用于工作项目。我想找出 protobuf 消息之间的区别,因此尝试使用 MessageDifferencer API。我在运行下面的代码时得到了 SEGV。注释行“reporter->ReportModified(*Obj1, *Obj2, field_path);”结果没有segv 任何有关使用差异的帮助表示赞赏!

google::protobuf::util::MessageDifferencer diff;
diff.set_report_matches(false);
diff.set_report_moves(false);
std::string reportDiff;
google::protobuf::io::StringOutputStream* opstream = new google::protobuf::io::StringOutputStream(&reportDiff);
google::protobuf::util::MessageDifferencer::StreamReporter* reporter =  new google::protobuf::util::MessageDifferencer::StreamReporter(opstream);
diff.ReportDifferencesTo(reporter);

std::vector<google::protobuf::util::MessageDifferencer::SpecificField> field_path;
try
{
    reporter->ReportModified(*Obj1, *Obj2, field_path);
}
catch (const std::exception& e)
{
    std::cout << e.what() <<"\n";
}

cout << __func__ << " Report added " << field_path.size();

//Cleanup objects
delete Obj1; 
delete Obj2;
delete reporter;

谢谢, 麦迪

【问题讨论】:

  • 恐怕这个问题还不够继续。理想情况下,您将提供一个最小的、可重现的示例 - 允许重现问题的东西 (stackoverflow.com/help/minimal-reproducible-example)。例如,这里最重要的方面之一是Obj1Obj2 的来源。如果您可以获得崩溃的堆栈跟踪信息,也将非常有用。
  • 谢谢!下次会记住这一点!

标签: protocol-buffers protobuf-c


【解决方案1】:

您不应该直接调用ReportModified 方法,MessageDifferencer 类会在发现差异时调用它。

MessageDifferencer::Compare 是正确的调用方法,根据docs。假设所有其他都是正确的,我相信在 try-loop 中更改您的代码以调用它应该可以工作。

将你的代码移动到一个函数中,你可以有类似的东西

std::string CompareMessages(
    const google::protobuf::Message& m1,
    const google::protobuf::Message& m2) {
  using google::protobuf::util::MessageDifferencer;

  MessageDifferencer diff;
  diff.set_report_matches(false);
  diff.set_report_moves(false);
  std::string reportDiff;
  {
    google::protobuf::io::StringOutputStream opstream(&reportDiff);
    MessageDifferencer::StreamReporter reporter(&opstream);
    diff.ReportDifferencesTo(&reporter);

    diff.Compare(m1, m2);
  }
  return std::move(reportDiff);
}

【讨论】:

  • 感谢您的回复!比较有效。我相信我们可以实现我们自己的报告类并在该实现中调用 ReportModified。我的意图是使用特定的字段路径。
  • diff.ReportDifferencesToString(&amp;reportDiff);换成diff.ReportDifferencesTo(&amp;reporter);更方便。
猜你喜欢
  • 2015-12-06
  • 2015-10-06
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多