1

私は Visual Studio の初心者で、VS 2010 C++ プロジェクトで Access Violation エラーが発生しています。アクセス違反エラーは、「free.c」Microsoft ファイルを指し示したり、プロジェクト コードの一部を指したりすることがあります。問題は、コードは私のものではありませんが、1 つまたは 2 つのコードを実装する必要があるということです。問題は、アクセス違反が発生しているコードの正確な部分を追跡する方法です。

誰かが興味を持っている場合: 私は OSG と Qt を使用しており、バックグラウンドで OSG レンダリングを実行するための新しいスレッドを作成しようとしています。簡単な例 (3d モデル + qt ボタンのみ) では、すべて正常に動作しますが、Qt ボタンをプロジェクトに実装しようとすると、常にアクセス違反が発生します。

お時間をいただきありがとうございます!

編集:

  • これは、黄色の矢印がntdll.dll!77972c39() を指している場所です。
  • [以下のフレームは正しくないか、欠落している可能性があります。ntdll.dll のシンボルがロードされていません]
  • kernel32.dll!7776c3d4()
  • 緑の矢印がmsvcr100.dll!free(void * pBlock) 行 51 C を指している場所です。
  • osg75-osg.dll!52f245f1()
  • osg75-osg.dll!52f2785e()
  • osg75-osgQtd.dll!osgQt::QGraphicsViewAdapter::assignImage(unsigned int i) 565 行目 + 0x59 バイト C++
  • osg75-osgQtd.dll!osgQt::QGraphicsViewAdapter::setFrameLastRendered(const osg::FrameStamp * frameStamp) 行 477 C++
  • osg75-osgQtd.dll!osgQt::QWidgetImage::setFrameLastRendered(const osg::FrameStamp * frameStamp) 54 行目 C++
  • osg75-osgViewer.dll!545b5a2e()
  • osg75-osgUtil.dll!52c8b6a3()
  • msvcr100.dll!malloc(unsigned int size) 89 行目 + 0x3b バイト C
  • msvcr100.dll!operator new(unsigned int size) 59 行目 + 0x8 バイト C++
  • osg75-osg.dll!52eac085()
  • ..何とか何とかosg dllなどを呼び出しています..

その間、新しいスレッドを作成しようとしたときだけでなく、さらにいくつかのさまざまな状況 (ルート グループに何かを追加しようとしたときでも) で問題が発生することがわかったので、本当に必要なのは、アクセス違反の原因をキャッチすることです。

4

2 に答える 2

3

同じアプリケーションでデバッグとリリースを混在させる可能性はありますか? Visual Studio のリリース ヒープとデバッグ ヒープには互換性がないため、デバッグ アプリケーションでリリース dll を使用したり、リリース アプリケーションでデバッグ dll を使用したりすることは、一般的に安全ではないことに注意してください。

Drescherjmのおかげで、それが解決策でした.

于 2012-09-21T03:51:05.590 に答える
2

無効なポインターのように聞こえます。問題が発生したときに最初に行うことは、プロジェクト コードに入るまでスタックを調べることです (一般に、"free" などは問題なく動作すると想定できます)。それを超えて、無効な値を取得した可能性がある方法を把握しています。

もちろん、それはもっと悪いことかもしれません。アクセス違反は、一般的な「なんらかのエラー」タイプです。たとえば、無効なポインターは、ランダムなメモリを破棄してそのポインターにヒットするコードによって作成される可能性もあります。実際にはポインターをアドレス指定しないため、犯人を見つけるのが非常に困難になります。ポインターが「確実に」ヒットするように見える場合は、ポインターにデータ変更ブレークポイントを設定してみてください。これは、そのデータが変更されるたびにブレークします。

もちろん、他にも多くのことがうまくいかない可能性があります。「ここをクリックし、そこをクリックすると、壊れている行が表示されます」という簡単なことはありません。

于 2012-09-18T06:28:10.567 に答える