• ベストアンサー

エラーの原因が・・・

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

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

#1です。 なんとなく、スタートアップの後始末処理で例外が発生している、かも、です。 newやmallocを使っているなら、そのあたりでバッファオーバーランを起こしていないかを、重点的に調べてみましょう。 あとは問題の絞込みですね。ある特定の処理を行った場合に症状が発生する、といったことがわかれば、大きな手がかりとなるのですが。

その他の回答 (3)

回答No.4

メモリ破壊が原因でしょう。 こういったときにはバイナリサーチの原理を利用してどこで異常が発生しているか調べるのも一つの手段です。 つまり、 Step1 プログラムの中盤辺りにブレイクポイントを設定して実行してみる Step2 Step1でブレイクポイントで止まる前に異常終了したら    プログラムの最初から中盤までの中間(プログラムの上から1/4辺りにブレイクポイントを設定して再度実行    ブレイクポイントまできたら、プログラムの中盤から最後までの中間(プログラムの上から3/4辺りにブレイクポイントを設定して実行 以下同様に調査していけば、比較的簡単に異常終了している場所を特定できます。 これは、簡単には解らないバグを調査するときに、非常に有効な方法の一つです。 念のために、プログラムの中盤とか1/4,3/4というのは、実行順序のことを言っています。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

とりあえずポインタでアクセスするところを精査するといいかも.

参考URL:
http://hp.vector.co.jp/authors/VA014436/prg_memo/windows/vctips/007.html
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

「呼び出し履歴」をさかのぼっていけば、ソースに突き当たると思います。

mentalplus
質問者

補足

呼び出し履歴の黄色い矢印は「msvcr90d.dll!1029e9ee」を指していますが、その後どうやってさかのぼればいいのか・・・ よろしければ教えていただけると助かります。

関連するQ&A

  • x64移行でのインラインアセンブラ修正

    Win32のプログラムをx64に移行する仕事を頼まれました。 プラットフォームをx64に移してビルドを行ったところ、 インラインアセンブラを使用していた以下のコードでエラーが発生しました。 ~前略~ __asm { mov eax, 0; /* EAXに0を入れる */ cpuid; /* CPUID実行 */ mov dword ptr [vender_sig + 0], ebx; /* 最初の4文字 */ mov dword ptr [vender_sig + 4], edx; /* 次の4文字 */ mov dword ptr [vender_sig + 8], ecx; /* 最後の4文字 */ mov byte ptr [vender_sig + 12], 0; /* ラストに \0 */ } ~中略~ __asm { mov eax, 1; /* EAXに1を入れる */ cpuid; /* CPUID実行 */ mov dword ptr [prosessor_sig], eax; /* プロセッサシグネチャ */ mov dword ptr [function_flag], ebx; /* ファンクションフラグ */ mov dword ptr [feature_flag2], ecx; /* Featureフラグ */ mov dword ptr [feature_flag1], edx; /* Featureフラグ */ } ~中略~ __asm { mov eax, 1; cpuid; /* CPUID実行 */ mov dword ptr [t], eax; /* top */ mov eax, 3; cpuid; /* CPUID実行 */ mov dword ptr [m], edx; /* middle */ mov dword ptr [b], ecx; /* bottom */ } ~後略~ x64ではインラインアセンブラが使用できないということはわかったのですが、 これをどう直していいかがわかりません。 アドバイスよろしくお願い致します。

  • deleteで開放するとエラーになる原因がわからない

    deleteでメモリ開放するとエラーになる原因がわからないです。 下記のようなプログラムを作ったのですが、deleteのところでエラーがでます。 エラー内容は 「Windows によって ****.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。****.exe または読み込まれた DLL にバグがあります。 あるいは、****.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。」 とでます。 ソースは wchar_t *aaa = L"ほげほげ"; wchar_t bbb[200]; wcscpy(bbb, aaa); delete aaa; wprintf(L"%s\n", bbb); getchar(); です。 どこに原因があるのでしょうか? [環境] WindowsXP+VisualC++2008 UNICODE使用

  • VC2005 プログラム領域への書込み制限について

    <前提> VC2005 で、以下のプログラムを実行すると、 エラーメッセージが出力されます。 <エラーメッセージ> test.exe の 0x004113c9 でハンドルされていない例外 が発生しました: 0xC0000005: 場所 0x004113cb に 書き込み中にアクセス違反が発生しました。 ----------- #include <stdio.h> void main(void) { unsigned long pc_pos; // PC位置をpc_posへ格納 __asm { CALL NXT NXT: POP pc_pos; } (*(unsigned char*)pc_pos) = 0x3F; return; } ----------- そこで、アセンブラで命令列をみると、 アドレス004113C9の場所で、発生しています。 ---------- // 今のPC位置を知るプログラムは? __asm { CALL NXT 004113BE E8 00 00 00 00 call NXT (4113C3h) NXT: POP pc_pos; 004113C3 8F 45 F8 pop dword ptr [pc_pos] } (*(unsigned char*)pc_pos) = 0x3F; 004113C6 8B 45 F8 mov eax,dword ptr [pc_pos] 004113C9 C6 00 3F mov byte ptr [eax],3Fh ※eaxレジスタには、0x004113c3 が格納されています ---------- さて、ここで質問です。 <質問> プログラム領域への書込みは、ライトプロテクトされています。 このライトプロテクトを一時的に外す方法はありますでしょうか。 つまり、0x004113c3アドレスに、3Fhを書き込んでも、 エラーが発生しない方法が知りたいです。 > プログラム領域に対する書込み命令コード 004113C9 C6 00 3F mov byte ptr [eax],3Fh

  • エンコード指定でコンパイルエラー

    以下のソースで、UnsupportedEncodingExceptionと、 コンパイルエラーが発生します。 byte[] sjisBytes; // 適当なバイト列を入れる String string = new String(sjisBytes, "Shift_JIS"); // エラー String s; // 適当な文字列を入れる byte[] b = s.getBytes( "Shift_JIS" ); // エラー サポートされている他のエンコーディング(UTF-8など)を入れても、 同じエラーになります。 原因がわかる方いらっしゃいますでしょうか?

    • ベストアンサー
    • Java
  • nasmでhello, world

    FreeBSD4.6.2にを使っているのですが、 以下のソースはコンパイル、実行はできるのですが 、 hello, worldが画面上に表示されません。 ebxに代入する標準出力って1であっていますよね?? どこが間違っているのかわかりません。教えて下さい。 アセンブルは nasm -f elf hello.asm ld hello.o ./a.out とやりました。 以下が ソースです。 section .data msg db "Hello, world!" section .text global _start _start: mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, 13 int 80h mov eax, 1 mov ebx, 0 int 80h

  • VisualC++でエラーが大量に

    学友がVisualC++で困っています。 私では力になりません 代わりに救済をお願いします。 彼曰く VisualC++2005をインストール。 C++設定で新規プロジェクトをウィザードを使って、MFCアプリケーションスタイルで作成してすぐにビルドを行うとエラーが109件。 エラーの中には構成文エラーや「識別子が定義されていない」などのエラーが含まれます。 原因と対策お願いします

  • メモリデータ比較中にハング

    メモリデータ比較中にハング A領域のデータとB領域のデータを先頭から比較するプログラムをアセンブラで組んでおります。 しかしかなりの頻度でプログラムがハングし、困っております。 ソースを眺めていても、どこが悪いのかわかりません。ハングの原因をうまく調べる方法はあるでしょうか? 動作環境:MS-DOS アセンブラ:MASM32 MOV ECX, srcAddr;Aのメモリアドレス PUSH ECX POP ESI MOV ECX, dstAddr;Bのメモリアドレス PUSH ECX POP EDI MOV ECX, CmpByte;比較するバイト数(比較するのは100000Hexバイト) XOR EAX, EAX CALL ENTER_PROTECT;プロテクトモードに移行 CALL GET_SORC_SEL;SORC_SELのBASE AddressとLimitを変更 CALL GET_DEST_SEL;DEST_SELのBASE AddressとLimitを変更 ; DWORD単位で比較するので2で割る SHR ECX, 2 @@compare: CLD ;CMPS*でのESI,EDIの変化を増加方向に @@cmp4: CMPSD DS:[ESI], ES:[EDI] ;4Byteずつ比較 jne @@err4 dec ECX jnz @@cmp4 ; 4で割った余り分のチェック MOV ECX, CmpByte AND ECX, 3 or ecx, ecx jz @@exit jmp @@cmp1 @@err4: ; 1Byteずつチェックしてコンペアエラーしたオフセットを割り出す LEA ESI,[ESI-4] ; コンペアエラー前のオフセットに戻す LEA EDI,[EDI-4] shl ecx, 2 @@cmp1: ;1Byteずつ比較 CMPSB DS:[ESI], ES:[EDI] jne @@exit dec ECX jnz @@cmp1 @@exit: ; コンペアしたByte数を計算(EAX <- CmpByte - ECX) MOV EAX, CmpByte SUB EAX, ECX PUSH EAX CALL FREE_SORC_SEL CALL FREE_DEST_SEL CALL LEAVE_PROTECT POP AX POP BX MOV DX, BX RET _MemCmp2 ENDP

  • 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文字超えているのでむりでした・・・。

  • エラーの原因がわかりません。

    調べたのですが原因がいまいちわからないので 質問させていただきます。 sqlName = new String(name.getByte("Shift_JIS"),"JISAutoDetect"); sqlYear = new String(year.getByte("Shift_JIS"),"JISAutoDetect"); sqllanguage = new String(language.getByte("Shift_JIS"),"JISAutoDetect"); sqlsonota = new String(sonota.getByte("Shift_JIS"),"JISAutoDetect"); String sql = ""; sql += " insert into user "; sql += " (name, year, language, sonota)"; sql += " values ( "; sql += "'" + sqlName + "'"; sql += ",'" + sqlYear + "'"; sql += ",'" + sqllanguage + "'"; sql += ",'" + sqlsonota + "'"; sql += " ) "; System.out.println("SQL文"); stmt.executeUpdate(sql); System.out.println("SQL文を発行"); }catch(Exception e){ System.out.println("SQLエラーが発生しました : " + e.toStrin()); } stmt.executeUpdate(sql)で例外が発生します。 SQLエラーが発生しました : java.sql.SQLException: Duplicate entry '' for key 1 stmt.executeUpdate(sql)には問題がないと思うので sql文でのエラーじゃないかと思っているのですが 原因がわかりません。 もしお分かりになる方がいればよろしくお願いします

  • saiがエラーで使えません

    ペイントツールのsai(有料版)を使って絵を書いているのですが、ここ暫く作業をしているといきなりエラー報告の小ウィンドウが現れ、「保護されていないエラーが発生したのでsaiを終了します。」というウィンドウが出てsaiが強制終了されてしまいます。 特にこの動作をするとエラーが発生する、ということはなく、ほんとうにいきなりエラーが出て強制終了、という感じです。 色々と調べてみたのですが、原因がわかりません。saiに問題があるのかと思い、再インストールをしたり、ペンタブ(BambooのBAMBOO PEN CTL-470)関係のソフトを再インストールしたりしましたが、改善しません。 同時進行で実行しているプログラムはGoogle Chromeくらいです。 参考までにsaiのフォルダ内にあるerrlogのログを貼り付けておきます。 -- 2014-03-05 14:04:07 --------------------------------------- ThreadID = 000023C4 OperationCategory = 80000000 OperationType = 00000000 OperationState = 00000000 ExceptionCode = C0000005 (EXCEPTION_ACCESS_VIOLATION) ExceptionAddress = 80000000 ExceptionFlags = 00000000 NumberParameters = 00000002 ExceptionInformation: 00000000 80000000 EAX = 0018EF40 EBX = 00000000 ECX = 00000000 EDX = 00004003 ESI = 003A0870 EDI = 00000082 EBP = 0018D648 ESP = 0018D5B4 EIP = 80000000 よろしくお願いいたします。

専門家に質問してみよう