[VisualC++6.0] デバッグビルドで突然変数の値が変わる問題について

このQ&Aのポイント
  • デバッグビルドでプログラムが強制終了されてしまう問題が発生しています。
  • while文中で突然変数の値が変わる現象が生じており、特に64,320等の値になるようです。
  • 問題の発生箇所はDBGHEAP.Cファイルの一部であることがわかっており、vectorを使っていることと関係があるか検討しています。
回答を見る
  • ベストアンサー

[VisualC++6.0] 突然変数の値が変わります

リリースビルドでは問題なく実行されるのですが、 デバッグビルドでは、途中でプログラムが強制終了されてしまいます。 Debug Error! Program:D:~~.exe DAMAGE:after Normal Block(#*****) at 0x********. このような警告ウィンドウが出ます。 デバッグしてみるとwhile文中で突然変数の値が突然変わっているように見えるのですが… (特に64,320等の値になるようです) DBGHEAP.C というファイルの /* if we didn't already check entire heap, at least check this object */ if (!(_crtDbgFlag & _CRTDBG_CHECK_ALWAYS_DF)) { /* check no-mans-land gaps */ if (!CheckBytes(pHead->gap, _bNoMansLandFill, nNoMansLandSize)) _RPT3(_CRT_ERROR, "DAMAGE: before %hs block (#%d) at 0x%08X.\n", szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)], pHead->lRequest, (BYTE *) pbData(pHead)); if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize)) _RPT3(_CRT_ERROR, "DAMAGE: after %hs block (#%d) at 0x%08X.\n", szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)], pHead->lRequest, →→→ (BYTE *) pbData(pHead)); } の →→→ の部分で引っかかっているようです。 vector<(クラス名)>を使っているのですが、関係あるのでしょうか? 素人な質問で申し訳ありません。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • abayama
  • ベストアンサー率48% (38/79)
回答No.1

プログラムの予想も付かない場所で、ポインタ操作を間違って壊している可能性が強いです。リリースビルドでたまたま正常に動いているように見えても、どこかで変な動作をしているでしょう。 Visual Studioには、指定したアドレスの内容が書き換えられたらそこでブレークする、という機能があります。この機能を使って(動作速度が桁違いに遅くなるのは難ですが)、実行してみてください。

moonlight_777
質問者

お礼

デバッグできました。 わざわざ回答ありがとうございました。

関連するQ&A

  • ファイナルデータ2006について

    ファイナルデータ2006を使用して復元しようとしたら、デバッグエラーが発生しました。 エラー内容は以下の通りです。 Debug Error! Program:F:\FinalData\FinalData.exe DAMGE:after Normal block(#41197496) at 0x050CE110 (Press Retry to debug the application) 中止 再試行 無視 と出て、どれを選択しても強制終了してしまいます。 どなかは解る方、お教え頂けませんか? 宜しくお願いいたします。

  • ASP.NET でビット演算できない

    ASP.NET でビット演算できません。 どなたか助言をください。 開発環境:Visual Studio 2005(.NET Framework Ver:2.0.50727) 言語:C# 以下ソース ------------------------------- public static int ToIntCtrlStatus(byte bStatus) {  byte DXF_STT_MCTL = 0x01;  byte DXF_STT_SCTL = 0x02;  byte DXF_STT_CTL = 0x03;  byte DXF_STT_MDRV = 0x04;  byte DXF_STT_SDRV = 0x08;  byte DXF_STT_DRV = 0x0C;  int nRet = 0;  if (bStatus & DXF_STT_CTL)  {     if (bStatus & DXF_STT_DRV)     {        if (bStatus & DXF_STT_MCTL) nRet = 3;        else nRet = 5;     }     else if (bStatus & DXF_STT_MCTL) nRet = 4;     else nRet = 1;  }  else if (bStatus & DXF_STT_DRV) nRet = 2;  else nRet = 1;  return nRet; } ------------------------------- ※ビルドすると、ソース内の「if (bStatus & …)」のbStatusの下に波線が出て、「型'int'を型'bool'に暗黙的に変換できません。」というエラーになります。

  • HEAP に関すること

    HEAP CORRUTOPN DETECTED: AFTER Normal block(c# 179) at 0x003EA6D0 CRT detected that the application wrote to memory after end of heap buffer; というエラーがでたのですが、最後の二行を訳すと、 ヒープ領域が終わったあとにアプリケーションがメモリーに書き込んだ のをCRTが発見したということになると思うのですけど、 これは、ヒープを使い切ったということになるのでしょうか? それとも、本来上書きしてはならないヒープの部分に上書きしたことに なるのでしょうか? ネットで今調べているのですがなかなか結論が出せなくて。

  • VisualC++2010Expressでのエラー

    Visual C++ 2010 Expressでエラーもなく、正常にビルドされたプログラムを終了した時に出力ウィンドウに 「テストプログラム.exe の 0x6b6b4444 で初回の例外が発生しました: 0xC0000005: 場所 0x00256a40 を読み込み中にアクセス違反が発生しました。 プログラム '[6396] テストプログラム.exe: ネイティブ' はコード 0 (0x0) で終了しました。」 というメッセージが表示されるのですが1行目にあるメッセージの意味がよく分かりません。プログラムそのものは途中で止まることなく動いています。 すべてのプログラムでこのメッセージは表示されます(Visual C++ 2010 Expressが自動生成したコードだけのプログラムでも)。 原因はウィルスチェックソフトが起動していることだというところまではわかったのですがアクセス違反を起こしたのはVisual C++ 2010 Expressの方なのかウィルスチェックソフトの方なのかよく分かりません。 それを調べる方法はないのでしょうか? また、このメッセージを無視して実行し続けていたら何か問題が発生することはあるのでしょうか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C++

  • メモリリークの件

    メモリリークについて教えてください。 最近VC++を勉強中なのですが、メモリリークというものを知り、_CrtDumpMemoryLeaks()をしたところ、以下のコメントが出力されました。 [コメント] Detected memory leaks! Dumping objects -> strcore.cpp(118) : {71} normal block at 0x00344978, 20 bytes long. Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2E {48} client block at 0x003428E8, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003428E8, 64 bytes long {43} client block at 0x00342720, subtype 0, 64 bytes long. a CDynLinkLibrary object at $00342720, 64 bytes long {41} client block at 0x003425D0, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003425D0, 64 bytes long Object dump complete. スレッド 0x584 終了、終了コード 0 (0x0)。 上記のコメントから、メモリリークを起こしていることはわかりました。ただ、strcore.cppというクラスは作成していないのですが、エラーが出ます。 多分他の関数から呼ばれているクラスだと思うため、クラス等をコメントアウトして調べたのですが、エラーがまだ出力されます。 (Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2Eここは自作クラス上の問題だと思います。) newとかの解放はしているのですが、他にメモリリークをする原因ってあるのでしょうか?

  • 並べ替えのプログラム

    整数を20個入力し、まずそのまま表示してその後大きい順に並べ替えて表示するプログラムを作っているのですが、最大値しか表示されません。多分for文の3重ループの中がおかしいと思うのですがよくわかりません。 #include <stdio.h> int main(int argc, char* argv[]) { int c,i,x,max; int sav = 0; int before[20]; int after[20]; int check[20] = {0}; printf("整数を20個入力してください: "); for(i = 0; i < 20; i++) { scanf("%d",&before[i]); } printf("\n"); printf("BEFORE\n"); for(i = 0; i < 20; i++) { printf("%d\n",before[i]); } printf("\n"); max = 0; for(c = 0; c < 20; c++) { for(x = 0; x < 20; x++) { for(i = 0; i < 20; i++) { if(before[i] > max && check[i] == 0) max = before[i]; sav = i; } if(check[sav] == 0) check[sav] = 1; after[19 - x] = max; } } printf("AFTER\n"); for(x = 0; x < 20; x++) { printf("%d\n",after[x]); } return 0; } よろしくお願いします。

  • 変数名(配列)の中の変数

    配列変数の名前の中に変数を入れたい場合、どのように記述すればいいのでしょうか? use strictを用いて、以下のように書いてみましたが、エラーが出て上手く動きません。 ループ x: 1-3 ループ y: 1-2 ${"answer$x"[$y]}=入力値 ←この部分を教えてください。    ループ閉 y ループ閉 x --------------------     answer1[1] answer1[2] answer2[1] answer2[2] answer3[1] answer3[2] とループを通るように、変数名を設定したいのですが、 エラーが出て実行ができません。 エラー:Can't use string ("answer1") as an ARRAY ref while "strict refs" in use at~ -------------------- 実際のプログラムは以下のように書いています。(該当部分のみ) for(my $x=1; $x<$num; $x++) { for (my $y=0; $y<$n; $y++) { my $y = ($x*$n)+$d; my @line = split(/\r/, $data[$y]); my @line0 = split(/\t/, $line[0]); ${"answer$x"[$y]} = $line0[0]; } } よろしくお願いします。

  • 起動時に何のダイアログも表示されない

    こんにちは。 大変恐縮ですがこちらで質問させてください。 開発環境はVC2005のMFCです。 質問内容は題名の通りなのですが、デバッグを実行しても何のダイアログが表示されない という状態になってしまいました。 すぐにデバッグが終了してしまいます。(「デバッグなしで開始」でも同様です。) プロジェクトはダイアログベース、スタティックライブラリ、ソケットを使える設定で 作成しました。 プロジェクトを作成してから他ダイアログを作り全てのダイアログに新しくボタンを配置したのと、初期配置のOK,キャンセルボタンを削除した以外は、コード上に手を加えるなどはしていません。 また、以下のようなエラーコードが出力されました。 Dumping objects -> f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\occmgr.cpp(195) : {75} normal block at 0x003496B8, 488 bytes long. Data: < > E8 03 00 00 00 00 00 00 E9 03 00 00 00 00 00 00 {74} normal block at 0x00349580, 248 bytes long. Data: < > FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 Object dump complete. プログラム '[1528] test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 何か原因と対策等がわかりましたら回答をいただければと思います。 よろしくお願いします。

  • eclipse終了時にエラーが出ます

    eclipseを終了したときに次のようなエラーが出ます。 Microsoft Visual C++ Debug Library Debug Error! Program C:\WINDOWS\デスクトップ\ECLIPSE\ECLIPSE.EXE DAMAGE after Normal block (#15) at 0x00780EC0 Press Retry to debug the application 中止    再試行    無視 また、eclipse.exeと同じフォルダにある、startup.jarを起動すると普通に終了できます。(起動時にeclipseのロゴは出ませんが) 使用環境は OS:Windows 98 SE JRE:1.5.0_10(SDKはインストールしていません) eclipse:3.2.1 です。 どうすれば、解決できるのでしょうか?ご存知の方いらっしゃれば、教えてください。お願いします。

  • DirectInputについて

    C++でDirectinputの事なのですが。 デバッグには成功するのに、起動した後すぐ強制終了してしまいます。 VOID KeyCheck() { BYTE KeyState[256]; HRESULT hr; hr = g_lpDIDevice->GetDeviceState(256,KeyState); if (SUCCEEDED(hr)) { if (KeyState[DIK_LEFT]&0x80) muki=0; } else hr = g_lpDIDevice->Acquire(); } directxの勉強に簡単なものを書いてみようと思ったのですが、どの辺りがいけないのでしょうか?

専門家に質問してみよう