2015-01-27 5 views
0

У меня есть такой сценарий:EXC_BAD_ACCESS в протоколе коде буфера

а) статическая библиотека создана для прошивки и используют классы буферов протокола, сгенерированные из файла Protobuf сообщения. Эта статическая библиотека используется в приложении (A)

б) protobuff сообщения имеет кучу инкубационных и allocated_setters, все C++ код

с) Применение (С), который имеет зависимость от проекта, который создает статическую библиотеку.

Что происходит:

Когда статическая библиотека входит в состав Application (A) и App побежал, я получаю 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"); 

Кикер, тот же код работает отлично на Application C на одном телефоне.

Статическая библиотека создается со следующими срезами: armv7, armv7s и arm64.

iPhone я пытаюсь это на это iPhone 5 и IOS 8,2 (бета)

EXC_BAD_ACCESS что-то делать с памятью, однако,

а) Почему же код работает с подобным когда он включен как зависимость от проекта, а не статическая библиотека. б) Есть ли способ отладки и реплики, что происходит? Я попытался включить зомби, но безрезультатно.

ответ

0

Казалось бы, :: google :: protobuf :: internal :: kEmptyString - это переменная, которая существует как в вашей статической библиотеке, так и в вашем приложении с разными значениями. Поэтому, если ваша компанияname32chars равна адресу одного из них, но не другого, это не распознается. Это всегда произойдет, если переменная установлена ​​в статическом библиотечном коде, но проверяется путем вложения в код приложения.

+0

благодарит за комментарий. Установщик ABCD * abcd = новый ABCD(); abcd-> set_companyname32chars ("Анды"); вызывается из с в статической библиотеке. Единственный интерфейс для библиотеки - это один API, OpenFile (NSString * filePath) -, . Я говорю это, нет другой ссылки set_companyname32chars, кроме как из в статически связанной библиотеке. – zyzzyxx

Смежные вопросы