web-dev-qa-db-ja.com

「このアプリケーションはランタイムに異常な方法でランタイムを終了するように要求しました」の原因は何ですか?

Visual Cランタイムによってスローされる一般的なエラーがあります。

このアプリケーションは、ランタイムに異常な方法で終了するようランタイムに要求しました。
詳細については、アプリケーションのサポートチームにお問い合わせください。

このエラーメッセージは実際には何ですかmean


たとえ話を使って、私が何を求めているかを正確に説明させてください。

メッセージが表示された場合:

例外:アクセス違反(0xc0000005)、アドレス0x702be865

このアクセス違反は、セクハラ、または私のコンピューターに侵入しようとしている人とは何の関係もありません(General Failureが私のCドライブを読み取ろうとしていた准将であったこと、またはWindows 95で違法な操作を行ったとして刑務所に連れて行かれました。

この場合、アクセス違反は、定数EXCEPTION_ACCESS_VIOLATION(値0xC0000005でwinbase.hで宣言)に対応します。この定数は、 EXCEPTION_RECORD 構造で返される可能性がある例外エラーコードです。コードACCESS_VIOLATIONは、プログラムがメモリ内のあるべきではないアドレスを読み書きしようとしたことを意味します。決して割り当てられなかったメモリアドレスから読み取ろうとすると、ひどく悪いことをしていることになります-そして、例外がそう伝えます。

通常は、プログラムが有効ではない、または無効になったメモリへのポインタを持っている場合に発生します。解決策は、無効なメモリへのアクセスを停止することです。

:私は not 質問:

  • プログラム x がC0000005エラーを取得する理由
  • コードにアクセス違反が発生する理由
  • アクセス違反のデバッグ方法

したがって、アクセス違反の原因を尋ねた場合、スタックトレースを確認したり、出力ウィンドウを監視したり、サンプルコードを投稿したりすることはありません。 「無効なメモリにアクセスしようとするからです。」


質問に戻ります。次のエラーの意味:

このアプリケーションは、ランタイムに異常な方法で終了するように要求しました。

私は(かなり)Microsoft Visual Cランタイムライブラリに機能がないことを確信しています。

void TerminateRuntime(bool UnusualWay);

だから私はそれが実際に何を意味するのか理解しようとする必要がある

  • ビジュアルCランタイムライブラリを terminate とはどういう意味ですか? (msvcrtはdllです。終了しないで、もう使用しないだけです)
  • MSVCRTを終了する usual 方法は何でしょうか?
  • 誰かが /を選択してnusualの方法で終了させますか
  • 今日の unusual wayは、以前は usual wayであったものの廃止された形式なので、実際には長いですか?
  • 私がwas(誤って)異常な方法で終了した場合、通常の方法で終了するにはどうすればよいですか?

言い換えると、MSVCRTはどのエラーをキャッチし、情報のないエラーメッセージの後ろに隠れていますか?

58
Ian Boyd

abort() functionが呼び出されると、そのメッセージが表示されます。

MSDNから

アボート

現在のプロセスを中止し、エラーコードを返します。

_void abort( void );
_

戻り値

abortは、呼び出し元プロセスに制御を返しません。デフォルトでは、現在のプロセスを終了し、終了コード3を返します。

備考

デフォルトでは、abortルーチンは次のメッセージを出力します。

「このアプリケーションは、異常な方法でランタイムを終了するようランタイムに要求しました。詳細については、アプリケーションのサポートチームにお問い合わせください。」

VCランタイムの最近のバージョンでは、メッセージは「abort()が呼び出されました」」に置き換えられているようです。おそらく実際の意味を明確にするためです。 、古いVC runtime(確かにVC++ 6.0))を使用し、abort()を呼び出します。

内部的には、 abort() が呼び出されると、internal.hで定義されている関数 _ amsg_exit を呼び出します。これは、基本的に「実行時エラーメッセージをstderrコンソールアプリケーション、またはWindowsアプリケーションのメッセージボックスにメッセージを表示します。 「このアプリケーションはランタイムに異常な方法で終了するよう要求しました」のエラーメッセージはcmsgs.hで定義されています。

cmsgs.h

_#define _RT_ABORT_TXT  "" EOL "This application has requested the Runtime to terminate it in an unusual way.\nPlease contact the application's support team for more information." EOL
_

(__RT_ABORT_)に渡されるエラーコードは、rterr.hで定義されています。

rterr.h

_#define _RT_ABORT  10  /* Abnormal program termination */
_

代わりに、_amsg_exit( _RT_ABORT )を呼び出すことでこれを再現できます


質問投稿者による更新:この質問を聞いてから2週間後、 レイモンド・チェンは自分のブログで答えました

プログラムを実行しているときに、メッセージで突然終了しますこのアプリケーションはランタイムに異常な方法で終了するよう要求しました。何が起こったのですか?

そのメッセージは Cランタイム関数abortによって を出力します。これは、プログラムも 終了コード3で終了 を引き起こす同じ関数です。

プログラムがアボートを明示的に呼び出すか、ランタイムライブラリ自体によって暗黙的に呼び出される場合があります。

C++標準では、terminateが呼び出される条件が詳しく説明されており、非常に長いリストであるため、ここでは繰り返し説明しません。詳細については、C++標準のお気に入りのコピーを参照してください。 (最も一般的な理由は、未処理の例外をスローすることです。)

42
JosephH