MATLAB调用DLL中函数时的堆栈限制是多少

2024-01-03

我试图弄清楚,当 MATLAB 调用 DLL 中的函数时,堆栈大小限制是多少。
有没有办法配置限制?

我在用loadlibrary, and calllib函数来调用 C 实现的函数(在动态链接库中)。

我创建了一个测试来找出堆栈限制。

我使用 MATLAB 2016a(64 位)和 Visual Studio 2010 来构建 DLL。

这是我的 MATLAB 源代码:

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.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

// 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;
}

The __try and __exceptblock 取自 Microsoft 示例:
https://msdn.microsoft.com/en-us/library/wb1s57t5.aspx 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


我使用不同的值执行了 MATLAB 代码size_in_bytes:
size_in_bytes = 1000000: Pass!
size_in_bytes = 10000000: Pass!
size_in_bytes = 50000000: Pass!
size_in_bytes = 60000000: Pass!
size_in_bytes = 70000000: 堆栈溢出!

看起来我的系统中的限制约为 64MByte(但我不知道这个数字是否适用于所有系统)。


我尝试修改堆栈大小Matlab.exe using editbin https://msdn.microsoft.com/en-us/library/xd3shwhf.aspx tool.
我尝试了以下命令(例如):
editbin /STACK:250000000 "c:\Program Files\MATLAB\R2016a\bin\matlab.exe".

此选项设置堆栈的大小(以字节为单位)并采用十进制或 C 语言表示法的参数。 /STACK 选项仅适用于可执行文件。

好像没什么影响...


似乎在 Windows 上堆栈的大小是在编译时设置的。所以你可以使用选项/F https://msdn.microsoft.com/en-us/library/tdkhxaks.aspx或二进制EDITBIN https://msdn.microsoft.com/en-us/library/xd3shwhf.aspx.

例如,您可以编辑以下文件:

EDITBIN /STACK:134217728 "C:\Program Files\MATLAB\R2016a\bin\win64\MATLAB.exe"

这会将堆栈大小设置为 128 MB(128 x 1024 x 1024 字节 = 134217728 字节)。

注意:请注意,编辑C:\Program Files\MATLAB\R2016a\bin\matlab.exe不会有任何影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB调用DLL中函数时的堆栈限制是多少 的相关文章

随机推荐

  • Xcode 模拟器表视图是黑色的

    当在模拟器中运行我的 Xcode 项目时 我的UITableView in my UIViewController not UITableViewController 是黑色的 这是我的模拟器的图像 我的代码cellForRowAtInde
  • 字符数组后出现奇怪的字符

    我是 C 的真正初学者 但我正在学习 我以前偶然发现过这个问题 并决定询问其原因是什么 请解释你的答案 以便我学习 我制作了一个程序 允许您输入 5 个字符 然后显示您编写的字符并恢复它们 例如 asdfg gfdsa 奇怪的是 输入的原始
  • 如何处理 x86 与 x64 软件包

    We use NuGet管理我们的第三方包 我们还必须建立x86 and x64 builds 我们现在依赖于NuGet包裹 zeromq 依赖于 C dll 因此有一个x86 and x64发布 在 Nuget 中搜索时 我只看到两个不同
  • Express 使用高级服务,无法创建全文索引

    我已经安装了 SQL Server 2012 Express Edition 高级服务 其中声明它包含全文索引 这是一个链接 说明了这一点 http msdn microsoft com en us library cc645993 asp
  • 如何从 SQL Server 获取 DateTime 数据而忽略时区问题?

    我的情况是我们将数据存储在SQL Server数据库中 支持2005年以上 当存储 DateTime 值时 它是客户端的本地时间 我需要能够在任何其他客户端上取回该日期 无论其他客户端可能位于哪个时区 例如 当纽约的用户输入 2012 12
  • 根据模板参数引用不同基类的函数

    include
  • CryptoJS AES-128-ECB 和 PHP openssl_encrypt 不匹配

    我有一些 PHP 代码 无法编辑 还有一个充满加密消息的数据库 key 297796CCB81D2553B07B379D78D87618 return encrypted openssl encrypt data AES 128 ECB k
  • 用于Linux进程管理的Python库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 通过我的网络界面 我想启动 停止某些进程并确定启动的进程是否仍在运行 我现有的网站基于 Python
  • 在每个时区的凌晨 12 点运行 cron 作业

    所以我认为每个时区之间大约有30分钟的时间 我想运行我的脚本cron php每个时区的中午 12 点 午夜 我怎样才能做到这一点 我正在看这段代码 TZ UTC 7 root date mail root TZ CEST 7 root da
  • Django 错误 ---index() 缺少 1 个必需的位置参数:'pk'

    尝试打开路径时出现此错误 它需要在我的 def 中进行 pk 并插入它 但问题仍然存在 如果有人能帮忙 我会欠你很多 这是我在浏览器中遇到的错误 TypeError at batches index missing 1 required p
  • Android 操作系统是否有 /etc/passwd、/etc/shadow 和 /etc/group 等文件?

    如果不是 android如何判断用户是否属于某个组 该线程讨论了如何完成此操作 http groups google com group android ndk browse thread thread adddb27c1a5438e9 h
  • Unity C# ArgumentOutOfRangeException:参数超出范围。参数名称:索引[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在创建一个像蛇一样的游戏 在我下面的代码中 蛇身体的每个部分都是 Character 类的一个实例 当我尝试添加新角色时 出现错误
  • python中数组的就地修改

    我发现这个问题要求对数组进行就地修改 以便将所有零移动到数组末尾 并保持非零元素的剩余顺序 根据问题陈述 就地意味着不复制原始数组 这取自 Leetcode 可以在 283 Move Zeroes 中找到 输入和输出的示例是 0 1 0 1
  • 如何在 Github Gist 中软换行

    我有一个很长的字符串 我想使用 Github Gist 将其嵌入到我的博客中 我想为其启用换行 以便读者不必向右滚动即可查看整个字符串 即使在编辑时单击 软换行 选项 最终的要点也不会换行 编辑时 启用软包装 保存后 无换行 How can
  • PHP 将任何尺寸的图像调整为 16:9 的宽高比

    午安 我目前正在尝试了解如何以 16 9 的宽高比裁剪服务器上已加载的图像 为了更好地理解 如果我有 4 3 图像 我必须剪切顶部和底部图像部分以使其适合 16 9 比例 Thanks 我举了这个代码示例 http myrusakov ru
  • Javascript 中类似 Python 的“类”

    我想知道如何在 Javascript 中创建类似于 Python 中的 类 采用此处列出的 Python 类和函数 class one def foo bar some code 函数 foo 将被调用one foo bar JS 的等价物
  • 在纯原生 Android 应用程序中渲染文本

    我有一个纯原生的 Android NDK 应用程序 需要在每一帧渲染一些文本 我读过一些帖子 说我需要使用字体的所有字符创建一个图像文件 然后将每个字符渲染为该图像的四边形 这听起来需要大量工作 而且我不知道从哪里获取简单字体 例如 Ari
  • 将lucene索引分成两半

    将现有 Lucene 索引拆分为两半的最佳方法是什么 即每个拆分应包含原始索引中文档总数的一半 拆分现有索引 无需重新索引所有文档 的最简单方法是 制作现有索引的另一个副本 即 cp r myindex mycopy 打开第一个索引 并删除
  • 元组索引超出范围,Tensorflow

    这是模型 它是基本的张量流模型 可以拍摄数字的图片并告诉您它是什么数字 我知道python中的索引从0开始 我遇到的问题是这行代码 model fit np array test np array num 阅读下面的代码以获取更多信息 im
  • MATLAB调用DLL中函数时的堆栈限制是多少

    我试图弄清楚 当 MATLAB 调用 DLL 中的函数时 堆栈大小限制是多少 有没有办法配置限制 我在用loadlibrary and calllib函数来调用 C 实现的函数 在动态链接库中 我创建了一个测试来找出堆栈限制 我使用 MAT