2

アプリケーション内でクラッシュが発生しているのを観察しています。コールスタックは次のように表示されます。

mfc42u!CString::AllocBeforeWrite+5    
mfc42u!CString::operator=+22 

なぜこれが起こっているのか分かりません。これも頻繁には発生しません。どんな提案も役に立ちます。クラッシュダンプがありますが、それ以上進むことができません。

私が行っている操作はこんな感じです

iParseErr += m_RawMessage[wMsgLen-32] != NC_SP;

ここで、m_RawMessageは512の長さのchar配列です。wMsgLenはunsignedshortであり、NC_SPは次のよ​​うに定義されます。

#define NC_SP   0x20     // Space

編集:

コールスタック:

042afe3c 5f8090dd mfc42u!CString::AllocBeforeWrite+0x5 * WARNING: Unable to verify checksum for WP Communications Server.exe 
042afe50 0045f0c0 mfc42u!CString::operator=+0x22 
042aff10 5f814d6b WP_Communications_Server!CParserN1000::iCheckMessage(void)+0x665 [V:\CSAC\SourceCode\WP Communications Server\HW Parser N1000.cpp @ 1279] 
042aff80 77c3a3b0 mfc42u!_AfxThreadEntry+0xe6 
042affb4 7c80b729 msvcrt!_endthreadex+0xa9
042affec 00000000 kernel32!BaseThreadStart+0x37 

これは完全なコールスタックであり、元のメッセージのようにコードスニペットを投稿しました

ありがとう

4

2 に答える 2

4

私はあなたにとって少しイライラするかもしれない提案があります:

CString :: AllocBeforeWriteは、システムがメモリを割り当てようとしていることを示しています。

他のメモリ操作(特にメモリの解放またはサイズ変更)が以前に破損している可能性がありますか?

C / C ++メモリ管理の一般的な問題は、メモリの解放(またはサイズ変更)のエラー(たとえば、同じメモリのジャンクを2回解放する)では、システムがすぐにはクラッシュしないが、後でダンプが発生する可能性があることです。メモリが割り当てられます。

あなたの状況は私にはそのように見えます。

悪いことは:

実際のエラーが発生する場所、つまりヒープが最初に破損している場所を見つけるのは非常に難しい場合があります。

これは、問題がたまにしか発生しない理由でもあります。事前に複雑な状況に依存する可能性があります。

于 2009-11-16T15:00:19.297 に答える
1

明らかなことを確認したと思います:wMsgLen> = 32

于 2009-11-16T14:16:20.680 に答える