コードは次のようになります。
if (chan->sampcnt < 8)
{
*data = 0;
return;
}
chan
有効な構造体へのポインタが含まれています。デバッガーでは、リストされている値`chan->sampcnt
は です-3
。どういうわけか、条件を false として解決せず、if ステートメントのスコープでコードを実行します。これは非常にまれなケースですが、重大なバグです。
sampcnt
のデフォルト値 は-3
、この条件を何度も実行されます。ほとんどの場合、正しく解決されますが、そうでない場合、事態は急速に悪化します。一体何が起こっているのですか?私は言葉を失います。私はこれまでにこのようなものに遭遇したことはありません。前もって感謝します。
更新(再開を促すため):
struct channel_struct
{
channel_struct()
{}
u32 num;
u8 vol;
u8 datashift;
u8 hold;
u8 pan;
u8 waveduty;
u8 repeat;
u8 format;
u8 keyon;
u8 status;
u32 addr;
u16 timer;
u16 loopstart;
u32 length;
u32 totlength;
double double_totlength_shifted;
double sampcnt;
double sampinc;
// ADPCM specific
u32 lastsampcnt;
s16 pcm16b, pcm16b_last;
s16 loop_pcm16b;
int index;
int loop_index;
u16 x;
s16 psgnoise_last;
};
これはマルチスレッド アプリケーションです。大規模で複雑なプロジェクトであるため、すべてのコードに精通しているわけではありません。別のスレッドで sampcnt が変更されているのではないかと疑っていますが、バグが発生すると、驚くほどの規則性が示されます。これにより、ある種の原子性の問題から遠ざかることができます。ただし、これはまだ考慮事項です。chan->sampcnt
別のスレッドで実行されているコードを変更するコードをまだ特定していませんが、存在する可能性があります。
ただ明確にします。 sampcnt
は double 型であり、私は確信しています。これは double として宣言され、デバッガーは double としてリストします。また、chan は type へのポインタstruct channel_struct
です。