2009-03-20 11 views
4

私はOpenGLプログラムを持っていますが、私のすべてのコンピュータで動作します。それは、Vista 64とRadeon HD4850を搭載したデスクトップです。この問題は、SwapBuffers(hdc)の呼び出しのようです。プログラムをクラッシュさせるSwapBuffers!

それは罰金コンパイルしてから、私に例外を与える:0xc0000005で:PROGRAM.EXEで0x00000000ので

未処理の例外違反をACCES。 SwapBuffersへの呼び出しの前に破るためにVC++を使用した

は、なるように、HDCの値を示しています

0xfe011734 {未使用= ???} CXX0030:エラー:式を評価することはできません

誰もがどのような可能性の手掛かりを持っています起こっている?あるPCから次のPCに変わるSwapBuffersについて何かありますか?私はそれがXP32、XP64と(別の)Vista64で動作するようになった。

while (!quit) 
    { 
     if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) 
     { 
      if (msg.message == WM_QUIT) 
       quit = true; 

      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 

     renderFrame(); //draws the scene 

     SwapBuffers(hdc); 

     if (GetAsyncKeyState(VK_ESCAPE)) 
      shutdown(); 

     think();  //calculates object positions, etc. 
    } 

問題のあるシステム(HD4850)のドライバは最新です。私はRadeon HD4870を搭載した別のVista64システム上のプログラムを実行して書きました。最新のドライバもあります。私が知る限り、これらの2つのカードのドライバは、両方ともHD48xxシリーズのものとほぼ同じです。その理由から、GPUが問題を引き起こしていることは奇妙に思えます。

とにかく、私は間違っていますか、これは記憶上の問題ですか? (アクセス違反)

また、SwapBuffers(hdc)の呼び出しを取り除くと、プログラムは一見うまく実行されますが、フレームバッファはスワップされないため、何も描画されません。しかし少なくとも安定しています。

コールスタック( - > ptrをスタックされる):相続人

ATKOGL32.dll!6aef27bc()  
    opengl32.dll!665edb2d()  
    opengl32.dll!665f80d1()  
    gdi32.dll!75e14104()  
-> MyProg.exe!WinMain(HINSTANCE__ * hinstance=0x009a0000, HINSTANCE__ * hprevinstance=0x00000000, char * lpcmdline=0x003b4a51, int nshowcmd=1) Line 259 + 0xe bytes 
    MyProg.exe!__tmainCRTStartup() Line 578 + 0x35 bytes 
    MyProg.exe!WinMainCRTStartup() Line 400 
    kernel32.dll!7641e3f3()  
    ntdll.dll!777dcfed()  
    ntdll.dll!777dd1ff()  

アセンブリ( - >実行される次の命令である):

  SwapBuffers(hdc); 
    009B1B5C mov   esi,esp 
    009B1B5E mov   eax,dword ptr [hdc (9BF874h)] 
    009B1B63 push  eax 
    009B1B64 call  dword ptr [[email protected] (0E1040Ch)] 
-> 009B1B6A cmp   esi,esp 
    009B1B6C call  @ILT+780(__RTC_CheckEsp) (9B1311h) 

答えて

0

これは、ほぼ間違いなくドライバのバグです。あなたがhdcの値を見ることができない理由は、クラッシュのトップスタックフレームが実際にATKOGL32.dllの中にあるが、デバッガがあなたのコードを示すためのシンボルがないからです。限り、私はATKOGL32.dllは実際にATIドライバのためのASUSラッパーであると言うことができ、クラッシュが発生する場所です。 amd.comの在庫ATIドライバをインストールし、クラッシュが依然として続くかどうかを確認することもできます。

OpenGLの一連の呼び出しに関係なく、ドライバがクラッシュすることはありませんが、私の経験では、通常、クラッシュはプログラムが行う何らかの無効な呼び出しの結果です。技術的にはこれを無視し、エラー状態を設定する必要がありますが、必ずしもそうではありません。 gDebuggerのようなプログラムを使って、無効なOpenGL呼び出しを簡単にチェックできます。

+0

私はこの質問をした後2年以上、他の技術フォーラムサイトの複数の投稿と同じように、私はまだこのカードの問題を解決できませんでした。私はコンピュータを再起動するたびにドライバを再インストールする必要があります。私はカードが間違っていると確信しています...あなたがおそらく最も近いのであなたの答えを受け入れるでしょう。 –

+0

「glFlush();」を追加してみてください。 "SwapBuffers"を呼び出す前に – Gediminas

1

あなたがアクセスすることができように見えますウインドウが破壊された後のHDCは、WM_QUITを取得するとすぐにループから脱出すれば問題は消えますか?

+0

Nope。プログラムを開始するとすぐにクラッシュが発生します。私は休憩を入れようとしました。 in after quit = true;同じ問題です... –

+0

クラッシュするコールスタックが何であるかを追加できますか? – Michael

0

hdcがどのように設定されていても、適切な値に見えません。この呼び出しの前にウィンドウが作成されていますか? hdcを傷つける可能性のあるこのアプリケーションに関連するマルチスレッドがありますか?

hdc自体のアドレスで時計を作成して、値が無効な場所に変更されたときに、変更箇所のヒントを表示するようにしてください。

+0

私はマルチスレッドを行っていません。 hdcはクラッシュする前に決して変わらないようです。私の他のコンピュータでは、hdcの値は同じです(未使用、式は評価できません)。 古いディスプレイドライバをインストールしましたが、PCを再起動するまでは正常に動作します。それから私はそれが動作するようにドライバを再インストールする必要があります。 –

+0

よろしく、うわー。それを発見した後の私のさらなる行動は、ハードウェアを使いこなすことです。ビデオカードを交換して、それが役立つかどうか確認してください。 –

+0

私は自分のHD4850を私の他の働いているPCのHD4870と交換しました。問題はありません。 HD4850のバグのようですか? –

関連する問題