none
コンパイル時、スタック領域を拡張するには? RRS feed

  • 質問

  • VS2015でVB.Netで開発しています。
    開発システムの中に巨大な関数があるせいで、スタックオーバーフローが発生してしまいます。
    そこで以下のURLを参考に、実行ファイルのスタック領域を4Mに拡張するバッチを作り、コンパイルのたびにそれを実行しているのですが、毎回それをやるのは面倒で困っています。
    (本当はその関数を整理するのが一番なのですが、それはけっこう大変なので…)

    コンパイル時に、実行ファイルのスタック領域を拡張するにはどうしたらよいのでしょうか?

    https://www.support.nec.co.jp/View.aspx?id=3150106539

    2021年4月16日 8:30

回答

  • プロジェクト->プロパティ->コンパイル->ビルドイベント->ビルド後のイベントのコマンドライン

    if exist "$(DevEnvDir)..\Tools\VsDevCmd.bat" (
    call  "$(DevEnvDir)..\Tools\VsDevCmd.bat"
    ) else (
    call  "$(DevEnvDir)..\Tools\vsvars32.bat"
    )
    
    REM 4MB
    editbin.exe /stack:4194304‬ "$(TargetPath)"
    
    echo StackSize=
    dumpbin.exe /HEADERS "$(TargetPath)" | findstr /C:"size of stack"

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2021年4月16日 9:33

すべての返信

  • 『ビルド後イベント』で、下記のようなコマンド ラインを指定してみては如何でしょう。

    "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x86\editbin.exe" /STACK:0x300000 "$(TargetPath)"

    設定箇所は、プロジェクトのプロパティの「コンパイル」タブにある「ビルド イベント(N)...」ボタンです。(Express だと使えないかも)

    editbin のパスやスタックサイズは、適宜調整してみてください。

    2021年4月16日 9:32
  • プロジェクト->プロパティ->コンパイル->ビルドイベント->ビルド後のイベントのコマンドライン

    if exist "$(DevEnvDir)..\Tools\VsDevCmd.bat" (
    call  "$(DevEnvDir)..\Tools\VsDevCmd.bat"
    ) else (
    call  "$(DevEnvDir)..\Tools\vsvars32.bat"
    )
    
    REM 4MB
    editbin.exe /stack:4194304‬ "$(TargetPath)"
    
    echo StackSize=
    dumpbin.exe /HEADERS "$(TargetPath)" | findstr /C:"size of stack"

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2021年4月16日 9:33
  • 「ビルド後のイベントのコマンドライン」でうまく行きました!ありがとうございました!
    2021年4月19日 10:27