2017-02-07 12 views
1

MATLABがDLLで関数を呼び出すときのスタックサイズの制限は何ですか?
制限を設定する方法はありますか?MATLABがDLLで関数を呼び出すときのスタック制限は何ですか?

私はloadlibrarycalllibはCで実装された関数(Dynamic-linkライブラリ)を呼び出す関数です。

私はスタック制限を調べるためのテストを作成しました。

私は、DLLをビルドするためにMATLAB 2016a(64ビット)とVisual Studio 2010を使用しています。ここで

は私のMATLABのソースコードです:

MyDll.h

// MyDll.h : DLL interface. 

#ifndef MY_DLL_H 
#define MY_DLL_H 

#ifdef MY_DLL_EXPORTS 
    #define MY_DLL_API __declspec(dllexport) 
#else 
    #define MY_DLL_API __declspec(dllimport) 
#endif 

extern MY_DLL_API int Test(int size); 

#endif 

MYDLL.C

:ここ

loadlibrary('MyDll','MyDll.h') 

size_in_bytes = 1000000; 

res = calllib('MyDll', 'Test', size_in_bytes); 

if (res == -1) 
    disp(['Stack Overflow... (size = ', num2str(size_in_bytes), ')']); 
else 
    disp(['Successful stack allocation... (size = ', num2str(size_in_bytes), ')']); 
end 

unloadlibrary MyDll 

は私のCのソースコードであります

// MyDll.c 

#include "MyDll.h" 

#include <windows.h> 
#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 


//Allocate <size> bytes in stack using _alloca(size). 
//Return 0 if OK. 
//Return (-1) in case of stack overflow. 
int Test(int size) 
{ 
    //Not allocated on the stack... 
    static wchar_t errorMsg[100]; 
    static wchar_t okMsg[100]; 

    int errcode = 0; 
    void *pData = NULL; 

    //Prepare messages from advance. 
    swprintf_s(errorMsg, 100, L"Stack Overflow (size = %d)", size); 
    swprintf_s(okMsg, 100, L"Successful stack allocation (size = %d)", size); 

    __try 
    { 
     pData = _alloca(size); 
    } 
    // If an exception occurred with the _alloca function 
    __except (GetExceptionCode() == STATUS_STACK_OVERFLOW) 
    { 
     MessageBox(NULL, errorMsg, TEXT("Error"), MB_OK | MB_ICONERROR); 

     // If the stack overflows, use this function to restore. 
     errcode = _resetstkoflw(); 
     if (errcode) 
     { 
      MessageBox(NULL, TEXT("Could not reset the stack!"), TEXT("Error"), MB_OK | MB_ICONERROR); 
      _exit(1); 
     } 

     pData = NULL; 
    }; 

    if (pData != NULL) 
    { 
     //Fill allocated buffer with zeros 
     memset(pData, 0, size); 

     MessageBox(NULL, okMsg, TEXT("OK"), MB_OK); 

     return 0; 
    } 

    return -1; 
} 

__try__exceptブロックは、Microsoftの例から取得され:
https://msdn.microsoft.com/en-us/library/wb1s57t5.aspx

DLLコンパイラフラグ:
/Zi /nologo /W4 /WX- /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_USRDLL" /D "MY_DLL_EXPORTS" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"x64\Debug\MyDll.pch" /Fa"x64\Debug\" /Fo"x64\Debug\" /Fd"x64\Debug\vc100.pdb" /Gd /errorReport:queue

DLLリンカーフラグ:
/OUT:"x64\Debug\MyDll.dll" /INCREMENTAL:NO /NOLOGO /DLL "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"x64\Debug\MyDll.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"c:\Tmp\MyDll\x64\Debug\MyDll.pdb" /SUBSYSTEM:CONSOLE /PGD:"c:\Tmp\MyDll\x64\Debug\MyDll.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X64 /ERRORREPORT:QUEUE


異なる値のsize_in_bytesを使用してMATLABコードを実行しました。
size_in_bytes = 1000000:合格!
size_in_bytes = 10000000:合格!
size_in_bytes = 50000000:合格!
size_in_bytes = 60000000:合格!
size_in_bytes = 70000000:スタックオーバーフロー!

私のシステムの上限は約64MByteです(しかし、この数値がすべてのシステムに当てはまるかどうかはわかりません)。


私はeditbinツールを使用してMatlab.exeのスタックサイズを変更しようとしました。
次のコマンドを試しました(たとえば):
editbin /STACK:250000000 "c:\Program Files\MATLAB\R2016a\bin\matlab.exe"

このオプションは、スタックのサイズをバイト単位で設定し、引数を10進表記またはC言語表記で受け取ります。/STACKオプションは、実行可能ファイルにのみ適用されます。

影響がないようです...

+0

スタックのサイズは実行時に設定されているため、osによって割り当てられるスタックのサイズを確認する必要があります。ちなみに、Cで '__try'で私に心臓発作をさせてください。 – Stargateur

+0

Windows 10ではどのようにしてサイズを設定できますか? – Rotem

答えて

0

ウィンドウでは、スタックのサイズがコンパイル時に設定されているようです。したがって、オプション/FまたはバイナリEDITBINを使用することができます。

+0

'editbin'を使って' Matlab.exe'を変更することを意味しますか?このように: 'editbin/stack:250000000" c:¥Program Files¥MATLAB¥R2016a¥bin¥matlab.exe "。それは影響がないようです... – Rotem

+1

あなたの答えは間違っているようです。それを削除してもらえますか? – Rotem

関連する問題