EXC_BAD_ACCESS协议缓冲区代码中

EXC_BAD_ACCESS in protocol buffer code

本文关键字:代码 缓冲区 ACCESS BAD EXC 协议      更新时间:2023-10-16

我有这种情况:

a) 为 iOS 创建的静态库,使用从 protobuf 消息文件生成的协议缓冲区类。此静态库用于应用程序 (A)

b)protobuff 消息有一堆 setter 和 allocated_setters,都是 c++ 代码

c) 应用程序 (C),它依赖于创建静态库的项目。

发生了什么事情:

当静态库包含在应用程序 (A) 中并运行应用程序时,我在协议缓冲区类的基本资源库之一中获得EXC_BAD_ACCESS。

    inline void ABCD::set_companyname32chars(const char* value) {
  set_has_companyname32chars();
  if (companyname32chars_ == &::google::protobuf::internal::kEmptyString) {
    companyname32chars_ = new ::std::string;
  }
  companyname32chars_->assign(value);
}

最后一行

companyname32chars_->assign(value) 

生成EXC_BAD_ACCESS。我使用这个二传手的方式是这样的:

ABCD* abcd = new ABCD();
abcd->set_companyname32chars("Andes");

问题是,相同的代码在同一部手机上的应用程序 C 上运行良好。

静态库是使用以下切片创建的,armv7、armv7s 和 arm64。

我正在尝试的iPhone是iPhone 5和iOS 8.2(测试版)

然而,EXC_BAD_ACCESS与记忆有关,

a) 为什么当相同的代码作为项目依赖项而不是静态库包含在类似的应用程序时,它适用于类似的应用程序。b) 有没有办法调试和确定正在发生的事情?我尝试启用僵尸,但无济于事。

看起来 ::google::p rotobuf::internal::kEmptyString 是一个变量,它存在于静态库和应用程序中,具有不同的值。因此,如果您的公司名称32chars等于其中一个的地址,而不是另一个的地址,则无法识别。如果变量是在静态库代码中设置的,但通过应用程序代码中的内联进行检查,则始终会发生这种情况。