2011-07-26 10 views
0

このコードがどのようにセグメンテーション違反を引き起こす可能性があるのか​​、私は完全に戸惑っています。コードは10.5+では正常に動作しますが、10.4ではsegフォルトが発生します。何か案は?フォールトはCFNumberGetValue中に発生します。CFNumberGetValueによるセグメント化エラー

EDIT:上記のコードは、以下のコードで辞書に追加された値を取得します。 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); 
} 
+0

あなたは 'volume_num'が実際に' CFNumberRef'であり、そのタイプが 'kCFNumberFloatType'であることを確認しましたか? – Richard

+0

はい!デフォルトのCFNumberRefが作成され、CFNumberGetValue呼び出しが行われる前にdictに追加されます。奇妙な。 –

+0

"デフォルトのCFNumberRef"はどういう意味ですか? – Richard

答えて

0

私はこのラインにセグメンテーションフォールトを突き止め:

mCurrentArray = CFArrayCreateMutableCopy(kCFAllocatorDefault, array_capacity, newArray); 

問題がarray_capacityがコピーされる配列のために(小さすぎ)間違っていたということで。なぜこれがプログラムの後の時点で失敗するのか、私は正確には分かりません。トリッキーなものを追跡すると10.4で問題が発生しただけです。

1
  • CFNumberGetValue(volume_num、kCFNumberFloatType、&ボリューム)

それは(レンジ/ nullのデータのうち、/無効にまたはポイント)あなたの変数の一つが無効であること可能性があります。

最も良い方法は、デバッグを有効にしてコンパイルすることです。 コアダンプを生成する(ulimit -cを参照)

アプリケーションがSEGVにヒットすると、コアファイルが生成されます。 まず名前を変更して何か便利な名前にします(上書きされません)。 その後、gdbで開きます。

ここから変数を調べて、どの変数を調べるかを調べることができます。 コアがgdbでオープンされている場合、ソースコードも表示する必要があります。

私はOSXにはあまり慣れていませんが、gdb/dbxまたは同等のものがあると仮定しています。

関連する問題