• 締切済み

スタックポインタを書き換えると例外が発生します

環境はVC++2005です。 espをグローバル変数の領域に変更したあとに関数の呼出しをすると、 例外が発生してしまいます(書き込み中にアクセス違反が発生しました)。 なぜでしょうか?(printfなどを呼び出さなければエラーは出ません) レジスタはちゃんと呼び出し前に退避し、返った後は元に戻しています。

noname#115727
noname#115727

みんなの回答

  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

そんなことはしてないと思いますが、聞いておきます。 スタックポインタを切り替えるなら、確保したグローバル領域の最後を 指定する必要がありますが、ひょっとして先頭にしていませんか?

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

ソースコードを見せてくださると、何かがわかるかもしれませんし、 何もわからないかもしれません。 少なくとも今よりは解決に向けて前進できることでしょう。

関連するQ&A

  • 例外発生(アクセス違反)

    こんにちは。 VB6で開発した自作アプリを実行すると アプリケーション例外が発生します。 ワトソンログを見ますとc0000005(アクセス違反)となっています。 ただ、コンパイルしなおしたEXEで実行すると問題なくできます。 (プログラム等は一切変更しておりません。) 例外に関しましても発生する場合と、しない場合があり、 頻度も3割くらいです。。。 確証はないのですが、別のパソコン(OS)でコンパイルしたEXE を実行すると必ず例外発生しているような。。。 (複数機能があるのですが、特定のもののみ例外発生します) こういう場合、プログラムに問題ありと考えるべきでしょうか???

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

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

  • ハンドルされていない例外とアクセス違反

    ハンドルされていない例外とアクセス違反 .NET2003のMFCでプログラムをしたところ上記のエラーが発生しました。 ビルドが通ったのでデバッグしたところ、"(mfc71d.dll) でハンドルされていない例外が発生しました""書き込み中にアクセス違反が発生しました"となりました。 また、自分ではプログラムしていないcppファイル中、以下の"{"の所でデバッグが止まってしまいました。 CSyncObject::CSyncObject(LPCTSTR pstrName) { UNUSED(pstrName); // unused in release builds プログラム初心者のためどこが悪いのかわからず困っています。 原因となるようなミスを教えてください。 よろしくお願いします。

  • VC++ 再帰呼び出しについて

    VC++6.0にてプログラミングを行っているものですが、 関数の再帰呼び出しについて質問です。 再帰呼び出しの際にスタックに積まれる変数というのは、 再帰呼び出しをする関数に渡す引数のことですか? スタックオーバーフローを起こさないために、 staticなポインタにHeap領域上の 変数を割り当てるとよい。 と分かったのですが、 この意味は、例えば static int *a = new int; ということなのですか?

  • メンバー関数ポインタ

    非常に基礎的なことで申し訳ないですが。 クラスのメンバー関数へのポインタ変数へ 代入しようとすると 関数呼び出しには引数リストがありません。 とエラーがでます。 何がわるいでしょうか? 以下のような感じのコードです。 void (classname::*P_func)() = classname::func; 定義しただけと思いますが。。 VCです。 よろしくお願いします。

  • Javaでポインタ的なことはできるか?

    JavaでC言語のようにポインタを使おうとしたらJavaには ポインタが表面上はサポートされていないことを知りました。 関数を呼び出した際に、呼び出し元の変数に影響を与えるようなプログラムは Javaで作れるのでしょうか? 例えば、以下のプログラムはCで関数を呼び出した際に呼び出し元の 変数の中身を関数内で書き換えてしまうプログラムです。 こういうことをJavaでするにはどう書けばよいのでしょうか? もしこういうことができないのであれば、Javaにはポインタに代わるやりかたがあるのでしょうか? 実行結果: 1 10 #include <stdio.h> void func( int *n ){   *n = 10; } int main(){   int n = 1;   printf("%d ", n );   func( &n );   printf("%d ", n ); }

    • ベストアンサー
    • Java
  • 例外 OEがVxD---の0028:c001817Ade 発生しました。

    過去にも同じような質問がありましたが、よく分らないので、改めて教えて下さい。 友達のPCの事で相談されたのですが、 例外 OEがVxD---の0028:c001817Ade 発生しました。 VxD---no0028:c0052DEDからの呼び出しです。・・・ と出ました。 僕は初心者、友達は超初心者で埒があきません。 結局どうしたらいいのか(・_・、) WIN98SE メモリー    96M Cドライブ    空き領域 186MB Dドライブ    空き領域 950MB   システムリソース 残り53% Userリソース   残り53% GDIリソース   残り68% 空き領域やリソースに何か原因があるのでしょうか?

  • C# 例外が発生しないことの保障

    Javaと比較して書きます。 Javaで記述した場合: public class JavaClass {  public static SampleClass s = new SampleClass(); } C#で記述した場合: public class CSharpClass {  public static SampleClass s = new SampleClass(); } JavaでもC#でも、同じコードを記述しているように見えますが、Javaではnew SampleClass()コンストラクタで例外が発生しない事が分かっているのに対して、C#の場合では例外が発生しないとは言い切れません。 これは、Javaでは、例外をスローする可能性のあるメソッド宣言では、その全てについてthrows宣言をしなければいけないのに対して、C#にはこの制約が存在しないことが原因です。 これについて何が困るかといいますと、C#で、static宣言な変数や静的コンストラクタで安易にメソッド呼び出し等を行うと、キャッチできなくなってしまいます。 public class Exceptionner {  public Exceptionner()  {   throw new ApplicationException("Exceptionnerクラスの例外");  } } public class SampleClass {  public static Exceptionner e = new Exceptionner(); // ここで例外が発生するが、キャッチできない。 } public class MyEntryPoint {  public static void Main()  {   try   {    SampleClass s = new SampleClass();   }   catch (Exception e)   {    // System.ApplicationExceptionでなくSystem.TypeInitializationExceptionとなる。    // つまり、元の例外の情報は失われている    Console.WriteLine(e.GetType());   }  } } これを現在漠然と問題視していますが、何かよい解決策はありませんでしょうか。 望んでいる解決策: ・C#でもメソッドが例外を返さないという保障がソースレベルでメソッドやコンストラクタに宣言可能? ・C#では例外をちゃんとキャッチしなくてもスマートに記述することが可能? ・問題視する必要がない?(whyも含めて)

  • 不正メモリアクセス例外って?

    基本情報の問題に関することですが、こちらで質問させていただきます。 メインメモリの使用についてです。 「取得した範囲外の領域や解放済みの領域を更新・参照した場合、更新時ではなく参照時に、メモリ領域違反(不正メモリアクセス例外)の障害が発生し、重大かつ原因の特定が困難な状況に陥る」 その理由は、 「更新するためには、事前に更新するメモリ領域が参照できなければ更新できないからである」 とされていましたが、これはどういう意味でしょうか。 プログラミングは入門程度しか勉強したことがないので、メモリ使用についてはあまり理解できていません。ご教示お願いします。

  • FormのUnload時に例外が発生する

    開発環境 :Windows2000 :VisualBasic6.0 :Oracle9i :CrystalReports10 お世話になります。 現在、VB6でCrystalReportsの帳票を出力する画面を作成しております。 画面はDirListBoxとFileListBoxからプレビューしたい帳票を選択し、 「印刷」ボタンを押下することで帳票が表示される、シンプルな作りと なっております。 今回質問したい内容は、帳票出力後に画面をUnloadしようとすると例外が発生することについてです。 Unloadするとデバッガが起動し、 「VB6.EXE[4桁の数字(毎回異なる)]でハンドルされていないWin32の例外が発生しました。」 というエラーが発生し、利用可能なデバッガとしてインストールされている VisualStudio2005が表示されます。 デバッグを開始すると 「0559884F mov eax,dword ptr [ecx+4] 」 でデバッグが止まり、 「VB6.EXE の 0x0559884f でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000058 を読み込み中にアクセス違反が発生しました。」 が表示されます。 これはどういったエラーなのでしょうか? ちなみにプログラム側でUnload処理部分からブレークポイントを設けてデバッグを行うと、上記例外は発生しません。 わかる方がいらっしゃいましたら、回答願います。

専門家に質問してみよう