🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

解決済

2回答

10885閲覧

プログラムのハンドルされていない例外が発生しました: Stack overflowの解決方法について

t.ewjspo

総合スコア17

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2019/10/01 05:37

visualstudioでfortran90を用いたプログラムを回しているのですが、以下のようなエラーメッセージが出ました。
'プログラム1.exe の 0x004d90a7 でハンドルされていない例外が発生しました: 0xC00000FD: Stack overflow'
同時にchkstk.asmというページが開き以下のtestの部分でブレイクポイントが生じました。
このエラーの解決方法を教えてください。

fortran

1; Find next lower page and probe 2cs20: 3 sub eax, _PAGESIZE_ ; decrease by PAGESIZE 4 test dword ptr [eax],eax ; probe page. 5 jmp short cs10 6 7_chkstk endp 8 9 end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

_chkstkは隠れたマイクロソフト社製ランタイムライブラリで、
Microsoft Docs - _chkstk Routine

_chkstk Routine is a helper routine for the C compiler. For x86 compilers, _chkstk Routine is called when the local variables exceed 4K bytes; for x64 compilers it is 8K.

とのことなので、64ビット版コンパイラを使用してもサブルーチン内のローカル変数が8192バイトを超えるとスタック使い過ぎ、と言うことで呼び出されるということですね。64ビット要素の配列で1024個しか使えません。(8 * 1024 = 8Kバイト)

先の回答者のotnさんが書かれているように、デバッグでトレース〔ステップ実行)するとすぐ分かったはずです。ある関数〔サブルーチン)を呼ぶか、終わった瞬間に_chkstkで落とされるでしょう。呼ばれて原因箇所が分かるだけ、幸運な状況だと思います。

投稿2019/10/01 09:22

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/10/01 10:11

> _chkstk Routine is called when the local variables exceed 4K bytes; さすがに小さ過ぎ、こんなに小さかったけか?と思って確認してみたら、違うようです。リファレンスの間違いか、何か別の秘密があるかも。 Visual Studio 2017 32bitビルドで以下のコードを確認。 void t01(void) { //NGint32_t a[100][100][26]; int32_t a[100][100][25]; printf("sizeof(a)=%d\n", sizeof(a)); memset(a, 0xff, sizeof(a)); } int main() { t01(); return 0; } int32_t a[100][100][25] はOK。sizeof(a)=1000000 と出力。 int32_t a[100][100][26] でNG。_chkstkでスタックオーバーフロー検出。
dodox86

2019/10/01 11:42

※自己レスですが記録の為にさらに追記。 上記 sizeof(a)=1000000 までOKだったのは、既定のスタックサイズ1MB、と言う仕様によるもよう。 コンパイルオプション "/F" https://docs.microsoft.com/ja-jp/cpp/build/reference/f-set-stack-size?view=vs-2019 > Without this option the stack size defaults to 1 MB. リンカーオプション "/STACK" で2倍の2MBにしたところ、 当初の2倍のサイズ、a[100][100][50] でOK、a[100][100][51] でスタックオーバーフロー。
t.ewjspo

2019/10/02 05:17

ありがとうございます。
guest

0

今までにデバッグをしたことがないのでしょうか?
ソースの処理を追って、スタックオーバーフローの原因を探ります。

投稿2019/10/01 05:56

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.ewjspo

2019/10/01 05:59

知識不足ですみません。 現在どの箇所でスタックオーバーフローが起こっているのがわからない状況です。
otn

2019/10/01 06:03

ですから、処理を追って、それを調べるんです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問