• 締切済み

VC++のエラー(初回の例外)の原因と回避策

VC++のプログラムを作っていて、たまに実行中に異常終了してしまうことがあります。 「****初回の例外が発生しました: 0xC0000005: 場所 ******* を書き込み中にアクセス違反が発生しました。 」 プログラム的にはメモリファイルマッピングして、そのデータをmemcpyでコピろうとする時にこの関数で上記エラーがでます。 毎回出るわけではなく、何度も実行される(ループなどで)とたまにおきているみたいです。 具体的にはどのような場合にこのようなエラーが生じるのでしょうか? また回避策はありますでしょうか?

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

0xC0000005はEXCEPTION ACCESS VIOLATIONと呼ばれ プログラム上のメモリアクセス違反を意味します。 >何度も実行される(ループなどで)とたまにおきているみたいです。 たまにおきているのではなく、 たまたま動いているという可能性もあります。 >どのような場合にこのようなエラーが生じるのでしょうか? このエラーが起こる原因は、殆どがプログラムミスで 書き込み、または読み込みしてはイケナイ領域に対しての アクセスが原因です。 やり易い例としては char str[4]; strcpy( str, "test" ); strは4バイト分の領域ですが、strcpyはtestの4バイトと '\0'含んだ全部で5バイトのデータをstrに書き込もうとします。 >回避策はありますでしょうか 回避策はありません。 れっきとしたバグなので、バグをつぶす以外に 解決策はありません。 VCではDebug実行して例外が発生すれば、 そのソース部分を表示してくれると思いますので、 (きちっとした環境を構築していれば) Debug実行してみれば分かると思います。

maki55555
質問者

お礼

ありがとうございます。 参考にさせていただきます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

0xC0000005なら アプリで管理しているメモリー空間以外にアクセスしようとしたといったことでしょう memcpyなら転送元か転送先のアドレスか転送するバイト数のどれかに不具合が生じるのでしょう 転送元が100バイトしか無いのに120バイト転送しようとしたとか エラー箇所がはっきりしているなら ログファイルに 何回目、転送元アドレス、転送先アドレス、転送バイト数 といった情報を書き込んでみてはいかがでしょう MFCで作成しているのであれば afxDumpオブジェクトに <<でシリアライズしてもいいでしょう VC++IDEの『出力ウィンドウ』に結果が出力されます

maki55555
質問者

お礼

ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • 初回例外

    VB2010EE 7 pro SP1 フォームを作成して、「デバッグ開始」をすると、最初に 'System.InvalidCastException' の初回例外が Microsoft.VisualBasic.dll で発生しました。 'System.ArgumentException' の初回例外が System.Windows.Forms.dll で発生しました。 とメッセージが出ます。 その後実行していっても特に問題はなさそうなのですが、 この初回例外は何でしょうか? 無視していいものでしょうか?

  • Visual C++2008でおきたエラーについて

    現在VisualC++2008でゲームを作っているのですが、 BGMをつけようと思いプログラムを少し追加したのですが test.exe の 0x005653b1 で初回の例外が発生しました: 0xC0000005: 場所 0x00000060 を読み込み中にアクセス違反が発生しました。 test.exe の 0x005653b1 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000060 を読み込み中にアクセス違反が発生しました。 プログラム '[2956] test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 と言ったエラーが出てきてしまい止まってしまいます、とりあえずCtrl+Zで最初の状態にもどしたにもかかわらず実行しようとすると上と同じエラーが出てきてしまい起動できなくなってしまいました、上のエラーはどのようなときに起こるのでしょうか?それとどうすれば回避できるか教えてくださいm(_ _;m) ソースファイルを張りたいのですが2000文字超えているのでむりでした・・・。

  • C++例外の回避方法

    VS2005でtest.exe から test.dll(VC++)を呼んで、プログラムを作っています。 しかし、デバッグの時に、以下の例外が発生しました。 test.exe の 0x7c812a5b で初回の例外が発生しました: Microsoft C++ の例外: int (メモリの場所 0x00115820)。 以上の例外は、どういう意味でしょうか? メモリのアクセスのエラーでしょうか? ソースコードは以下のようになります。 test.dllプログラムの構造としては、以下のようになります。 char readrecordTemp[READ_SIZE + 1]; memset(readrecordTemp,0x00,sizeof(readrecordTemp)); char returncode1 = 0; char returncode2 = 0; try{ for(;;){ if (NULL == fgets(readrecordTemp,VT_MAX_READ_SIZE, m_fp)){ if (ferror(m_fp)){ throw ERROR_IO; } if (feof(m_fp)){ throw EOF; } } returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ]; returncode2 =readrecordTemp[strlen(readrecordTemp) -1 ]; 。。。。 。。。。 } ファイルの最後になったら、自分が定義した例外で returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ]; returncode2 =readrecordTemp[strlen(readrecordTemp) -1 ]; などを飛ばしたいですが、デバッグの時に、 returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ];のところで 以上の例外が出されました。readrecordTempが短すぎると長すぎると 問題になるといわれてましたが、実際にどういう問題でしょうか? readrecordTempは2より短いときに、問題だが、ではどうやって 回避できるでしょうか? readrecordTempの最後の二つの符号を取りたいですが、 どうすればいいですか?

  • mscorlib.dllの初回例外について

    VB2005 SP1にてプログラミングを行っています。同じプログラムを2つのPCで動作させるとどうも挙動がおかしくなります。 動作環境1 デスクトップPC VB2005 SP1、VB2003導入済み FrameWorks 1.1 , 2.0 , 3.0 , 3.5導入済み Windows XP SP3 動作環境2 ノートPC(パナソニック「レッツノート」) VB2005 SP1のみ導入 FrameWorks 1.1 , 2.0 , 3.0導入済み Windows XP SP2 デスクトップのPCにて作成したプログラムをノートPC上で動作させると、なぜか 'System.NotSupporterException'の初回例外がmscorlib.dllで発生しました。 という警告文が表示され、記述したコードがうまく働きません。動作環境はほぼ同じになっています。 FrameWorksのエラーかと思い再インストールしましたが治りません。コードが悪さをしているのか思い、全てのコードを消してデバッグをしてもこの例外が表示されます。 いろいろ調べてみたのですが有効な解決策が見つからず・・・この場合、やはり実行環境に問題があるのでしょうか?

  • VC++2010Exデバック実行エラー

    VC++2010Expressのデバック実行時にエラーが出て困っています。 VC++初心者レベルです。 宜しくお願い致します。 VC++2010Expressにて、OpenCV2.2を使用したプログラムを組むため学習中です。 OSはXPです。 OpenCVのサンプルプログラムを includeファイル、libファイルのパス(デバッグ用lib)の設定をして、 ビルドは正常に完了するのですが、デバック実行時(メニューバーの三角ボタン)に エラーが発生し、下記文面のVC++のエラーダイアログボックスがでます。 ==== imgCapture.exe の 0x7c94e4ff (ntdll.dll) でハンドルされていない例外が発生しました: 0xC0000235: NtClose は NtSetInformationObject 経由のクローズから保護されているハンドルにコールされました。 ==== 1.OpenCVが原因の可能性 OpenCVの関数  cvCaptureFromCAM(0) の前に矢印がついて止まっており、OpenCV2.2が最近出たばかりなので、 そのバグではないかと疑いましたが、 別PCの同様の環境で同じプロジェクトをビルドし、デバック実行すると、問題なく動作しました。 2.VC++2010Expressのプロジェクト設定が原因の可能性 上記同様、同じプロジェクトで別PCで動作しているため問題ないようです。 3.VC++関連が原因の可能性 現在使用しているPCは、もともとVC++2008Expressをインストールしておりましたので、 アンインストールせず、VC++2010Expressをインストールしてしまったことが原因かと考え、 VC++2008Express、VC++2010Express、関連アプリケーションをアンインストールして、 VC++2010Expressのみインストールしなおしてみましたが、解決しませんでした。 4.環境変数の可能性 ビルドで生成された.exeファイルを直接実行すると問題なく実行されましたので、 dllのパス設定は問題ないようです。 ビルドで生成されたexeが直接実行できるので、VC++関連が原因だと考えているのですが、 VC++2010Expressをインストールしなおしても解決しないため、お手上げ状態です。 問題なくデバック実行できる別PCと同じ設定にしているつもりですが、見落としがあるかも知れません。 解決方法、見落とし、これを試してみてはなど、気がつかれたことがありましたら アドバイスよろしくお願いいたします。

  • VC++でCatchできる例外について

    DBサーバにて常駐動作させているプロセス(VS6.0にて作成したVC++のプログラム)にエラーが発生して停止してしまいました。 イベントログにてアプリケーションログ、システムログを見ると、以下のようなエラーが出ていました。(日付、ユーザ、マシン名、エラー発生アプリケーション名は伏せております) ■アプリケーションログ■ イベントの種類: エラー イベント ソース: Application Error イベント カテゴリ: (100) イベント ID: 1000 説明: エラー発生アプリケーション <プログラム名>.exe、バージョン 0.0.0.0、エラー発生モジュール MSVCRTD.DLL、バージョン 6.0.8168.0、エラー発生アドレス 0x00011920 ■システムログ■ イベントの種類: 情報 イベント ソース: Application Popup イベント カテゴリ: なし イベント ID: 26 説明: アプリケーション ポップアップ: <プログラム名>.exe - アプリケーション エラー : 例外 unknown software exception (0x80000003) がアプリケーションの 0x10211920 で発生しました。 原因が分からないため、せめて上記エラーが発生しても停止しないよう、主要処理部全体を以下のように例外処理で囲むことで暫定対応しようとしております。 try{  主要処理 }catch(...){  エラー発生時の処理 } 改修後、同様なエラーを模擬的に発生させ、停止しないことを確認しようとしましたが、「エラー発生モジュール MSVCRTD.DLL」となるエラーを発生させることができません。 上記try-catchで「エラー発生モジュール MSVCRTD.DLL」となるエラーがキャッチできるかどうか、ご存知の方はおられましたらご教示いただけないでしょうか? 宜しくお願い致します。

  • VC2005でのエラー

    デバッグすると以下のようなエラーが出るんですが,意味がわかりません. どういうことなのでしょうか? 'System.AccessViolationException' の初回例外が 0003.exe で発生しました。 'System.AccessViolationException' のハンドルされていない例外が 0003.exe で発生しました。 追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。

  • 例外処理(初回)についてのご質問

    プログラムを実行させた時、下記の様なメッセージが出力されたあとに、特定の場所でエラーが出てしまいます。 色々と試して見たのですが、解決出来ずに困っております。何方かどの辺を調べれば良いか等のアドバイスをお願い致します。 <エラーメッセージ> "例外処理 (初回) は XXXX.exe (MFC42D.DLL) にあります: 0xC0000005: Access Violation。" <停止場所> CWnd* CWnd::GetDlgItem(int nID) const { ここです→ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlCont == NULL) return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID)); else return m_pCtrlCont->GetDlgItem(nID); } <エラーが発生するプログラム> BOOL CComProgramDlg::BinarySend(BYTE SendData[], unsigned long SendLength) { int Ret; unsigned long Len; ここら辺です→CStatic* pStic1 = (CStatic*)GetDlgItem(IDC_MSG_STATIC); Ret = WriteFile(m_hComm, &SendData[0], SendLength, &Len, NULL); if(!Ret)  return(FALSE); if(SendLength > Len)  return(FALSE); pStic1 -> SetWindowText("データを送信しました。"); return(TRUE); } 上記はデータシリアル通信の送信用で10回程度、このメンバ関数を通した時に急に発生します。 よろしくお願いいたします。

  • エラーの原因が・・・

    ただいまVisualC++を使ってプログラミング中なのですが、エラーの原因が分からず困っています。 デバッグ開始(緑色のボタンをクリック)して以下のような状態になります。 エラーメッセージは「test.exe の 0x1029e9ee でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcdcdcdcd を読み込み中にアクセス違反が発生しました。」です。 エラーが出ているのは逆アセンブルのところで、main関数の終わり(}のところ)からステップインをしていった途中の「movsx ecx,byte ptr [eax]」の文でエラーが発生していることが分かりました。 この文はソースのどの部分に対応しているか分からず、困っています。 いつもは配列の添字が要素数を超えていたりするのですが、エラーの場所が場所なので原因が分かりません。 ソースコードは分割が多く、どこを載せていいのかさっぱりです。 情報が少ないので、必要な情報などありましたら言ってください。

  • VC++でDeugモードOKで、Releaseモードのみでエラーが出る?

    マイクロソフトのVisualC++で テキストデータを処理するプログラミングしています。 (MFCは使っていません。) 使用してたプログラムの 一部の変数をクラス化しました。 数多くのエラーをかいくぐり、 Debugモードでは、 目的の演算を実行することができるようになりました。 ところが、 このプロジェクトをReleaseモードでビルド実行すると、 「trans1.exe の 0x0040d052 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x2eb11a94 に書き込み中にアクセス違反が発生しました。」 というエラーが出て止まってしまいます。 プロジェクトのプロパティ設定で、 ヒープ領域をDebugモードと 同じにしてみたりしたのですが、 状況は改善されません。 メモリの問題のような気がして、 配列の大きさ等をチェックしましたが、 問題なしでした。 プログラムを他の人が使えるように するためには、 Releaseモードが必要なので困っています。 どなたか、アドバイスかご教示お願いします。 デバッグ方法を教えて頂いても大変助かります。 よろしくお願いします。