別のチームが作成した C++ コードを使用する CLI ラッパーを入手しました。ソースコードに非常に大きな変更を加えたいくつかのバージョンがあるため、CLI から AccessViolationExceptions がランダムに取得されます。完全にランダムなので、例外が発生する状況を突き止めようとしましたが、成功しませんでした。
スタックトレースは次のとおりです。
at QDataStream.{ctor}(QDataStream* , QByteArray* , QFlags<enum QIODevice::OpenModeFlag>* )
at XMLParsers.privGetCheckSumOf(XMLParsers* , ParameterManager* PM, ActiveFlag Active)
at XMLParsers.Set_XMLStream(XMLParsers* , QXmlStreamWriter* pXSW, ParameterManager* PM, ActiveFlag Active)
at XMLParsers.ExportToExchangeFormat(XMLParsers* , QString* , ParameterManager* PM, ActiveFlag Active)
at XMLParsers.ExportToXML(XMLParsers* , basic_string<char\,std::char_traits<char>\,std::allocator<char> >* , ParameterManager* PM, ActiveFlag Active)
at ParameterManager.GetExchangeFormat(ParameterManager* , basic_string<char\,std::char_traits<char>\,std::allocator<char> >* , ActiveFlag Active)
私の最初のステップは、QDataStream を使用するときにインターネットで例外を検索することでしたが、何も見つかりませんでした。だから私の恐れは、いくつかの内部ポインタが壊れていることです。唯一の奇妙な点は、この例外がまったく同じ入力でランダムに発生することです。(全通話の約1~2%)
とにかく、元のソースコードをここに投稿するのは多すぎるでしょう - C++ コードで呼び出されるコードの行は数千なので、ここでの私の主な質問は、例外がどの特定の行に由来するかではなく、どのように (一般的に)この AccessViolationException を絞り込むことができます。
- どのメモリ プロファイリング ツールをお勧めしますか? 上記の QDataStream Ctor への呼び出しがこの例外の理由ではないと思います。(クラスの既に無効な状態) を検出できる部分にすぎないと思います。
- AccessViolationException からさらに情報を取得できますか? 現時点では、アプリケーションがクラッシュするだけで、Windows イベント ログからしかスタック トレースを取得できません。
- この例外の詳細情報を見つけるために、CLI で確認/変更できるヒントはありますか?
何日も (そして何晩も..) 検索した後、このバグに絶望しているので、助けていただければ幸いです。