Ошибка сегментации с CFNumberGetValue - PullRequest
0 голосов
/ 27 июля 2011

Я полностью озадачен тем, как этот код может вызвать ошибку сегментации. Код работает нормально на 10.5+, но ошибки сегмента на 10.4. Есть идеи? Ошибка возникает во время CFNumberGetValue.

CFNumberRef volume_num = (CFNumberRef)CFDictionaryGetValue(dict, CFSTR("Volume"));
if(volume_num != NULL) {
    float volume = 1.f;
    CFNumberGetValue(volume_num, kCFNumberFloatType, &volume);
};

РЕДАКТИРОВАТЬ: код выше получает значение, которое было добавлено в словарь с помощью кода ниже. mKitManager.GetKitVolume () возвращает значение по умолчанию 1,0.

AddFloatToDictionary(dict, CFSTR("Volume"), mKitManager.GetKitVolume());

static void AddFloatToDictionary(CFMutableDictionaryRef dict, CFStringRef key, float value)
{
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberFloatType, &value);
    CFDictionarySetValue(dict, key, num);
    CFRelease(num);
}

Ответы [ 2 ]

1 голос
/ 27 июля 2011
  • CFNumberGetValue (volume_num, kCFNumberFloatType, & volume)

Вероятно, одна из ваших переменных недействительна (или указывает на недопустимые / вне диапазона / нулевые данные).

Лучший путь вперед - компилирование с включенной отладкой.Разрешить генерацию дампов ядра (смотрите ulimit -c)

Когда ваше приложение достигает SEGV, будет сгенерирован файл ядра.Сначала переименуйте его во что-нибудь полезное (чтобы оно не перезаписывалось).Затем откройте его с помощью gdb.

Оттуда вы можете исследовать переменные, чтобы увидеть, что не должно быть.Вы также должны иметь возможность просматривать исходный код, когда ядро ​​открыто с помощью gdb.

Я не слишком знаком с OSX, но я предполагаю, что у вас будет gdb / dbx или его эквивалент.

0 голосов
/ 28 июля 2011

Я отследил ошибку сегментации до этой строки:

mCurrentArray = CFArrayCreateMutableCopy(kCFAllocatorDefault, array_capacity, newArray);

Проблема в том, что array_capacity был неправильным (слишком маленьким) для копируемого массива. Почему это может вызвать ошибку на более позднем этапе программы, я точно не уверен. Хитрый, чтобы выследить и только вызвало проблемы на 10.4.

...