首页 / 知识
在C中检查可用的堆栈大小
2023-04-14 19:32:00

Checking available stack size in C我正在将MinGW与GCC 3.4.5(mingw-special vista r3)一起使用。 我的C应用程序使用了很多堆栈,所以我想知道是否有什么方法可以通过编程方式告诉您还剩下多少堆栈,以便在发现即将用完时可以完全解决这种情况。 如果不是,您还可以通过其他什么方法来解决可能耗尽堆栈空间的问题? 我不知道我要从多大的堆栈开始,因此也需要以编程方式识别它。
getrusage函数可获取当前用法。 (请参见
Linux中的
请看一下 将局部变量的地址从堆栈中取出将起作用。然后,在一个更嵌套的调用中,您可以减去另一个本地的地址,以找出它们之间的差异
如果您的代码是多线程的,则需要处理每个线程的top_of_stack变量。 检查您的编译器是否支持stackavail() 雷蒙德·陈(The Old New Thing)对于此类问题有很好的答案:
这是有关堆栈分配的Win32详细信息:MSDN。 如果您认为自己可能受到堆栈空间的限制,那么几乎可以肯定会受到可用虚拟内存的限制,在这种情况下,您将需要找到其他解决方案。 您到底想做什么? 对于Windows:在使用来自Kernel32.dll的VirtualQuery函数之前,我已经完成了此操作。 我在C#中只有一个示例,但它演示了该技术:
顺便说一句:也可以在StackOverflow上的另一个问题上找到此代码,当我尝试修复代码中的错误时,我又问了这个问题:算术运算导致不安全的C#enter链接描述溢出。 这是我已经放弃的问题。通过大量的黑客攻击(主要是祈祷),您可以获得在给定时间在给定计算机上运行的解决方案。但是总的来说,似乎没有做到这一点的体面方法。
您将必须从程序外部获取堆栈的位置和大小(在Linux上,您可以从 因此,现在您有了堆栈的位置,堆栈的大小和当前位置,并假设您知道堆栈向哪个方向增长。什么时候进入堆栈溢出模式?您最好不要接近尾声,因为您的估算值(即局部变量的地址或来自堆栈指针的值)可能有点过于乐观;在堆栈指针之外寻址内存并不罕见。同样,您不知道任何给定函数(及其调用的函数)在堆栈上需要多少空间。因此,您最后必须留出一些空间。 我只能建议您不要陷入困境,并尽量避免进行深度递归。您可能还想增加堆栈大小;我相信,在Windows上,您必须将其编译为可执行文件。
假设您知道完整堆栈的大小,则可以添加一些汇编代码来读取ESP。
在Linux上,您将调用getrusage并检查返回的struct rusage的 从MINGW站点及其sourceforge站点对补丁的跟踪来看,我发现在2008年5月,围绕getrusage进行了一些补丁,并且似乎已经得到了相当长的支持。您应该仔细检查MinGW支持多少典型Linux功能方面的任何警告。 也许这仅对Windows平台有用: 在您的exe文件的PE标头(IMAGE_NT_HEADERS)中,有一些记录,例如:
有一种简单的方法来获取这些值:使用GetModuleHandle(NULL)将为您提供模块的图像库(句柄),并在其中找到IMAGE_DOS_HEADER结构的地址,这将帮助您找到IMAGE_NT_HEADERS结构(imagebase + IMAGE_DOS_HEADER。 e_lfanew)-> IMAGE_NT_HEADERS,然后在其中找到这些字段:SizeOfStackReserve和SizeOfStackCommit。 操作系统将为您的堆栈分配的最大空间为SizeOfStackReserve。 如果您考虑尝试此操作,请告诉我,我们将为您提供帮助。有一种方法可以获取特定点使用的堆栈大小。 |
最新内容
相关内容
linux检查挂载命令?
linux检查挂载命令?,设备,系统,信息,情况,状态,服务,软件,命令,磁盘,网络,linux查看nas挂载路径1、可以通过以下命令来查看主机是否使用NAS盘:linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux发现新网卡命令?
linux发现新网卡命令?,系统,信息,网络,电脑,工具,服务,状态,命令,网卡,名称,在linux下如何通过命令查网卡配置1、linux查看系统网卡信息的命令linux一般检查命令?
linux一般检查命令?,网络,系统,检测,情况,工作,信息,命令,进程,时间,设备,linux查看进程命令linux 下查看进程可以使用的命令:ps命令查找与进程检查硬件linux命令?
检查硬件linux命令?,信息,系统,第一,数据,设备,检测,命令,情况,灵活,实时,如何查看linux系统CPU信息这里我先介绍一个文件。它就是/proc目录文linux命令发现不了?
linux命令发现不了?,软件,系统,发行,工具,名称,不了,命令,地方,代理,信息,linux命令中的makewhatis命令,使用的时候提示未发现命令,怎搞好?_百检查路由命令linux?
检查路由命令linux?,网络,地址,系统,信息,工具,电脑,时间,通信,服务,命令,linux为了确定网络层经过的路由器数目应用什么命令1、发现到达目标linux保留堆栈命令?
linux保留堆栈命令?,地址,工作,系统,信息,管理,命令,目录,代码,名称,连续,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令、calinux数据库检查命令?
linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,在linux中,怎样查看Mysql服务运行状态?1、psaux或netstat-tlunppslinux分区检查命令是?
linux分区检查命令是?,系统,设备,工具,管理,情况,信息,检测,分区,密码,单位,如何在Linux上分区硬盘1、使用ssh远程连接工具登录到系统,使用fdislinux检查流量的命令?
linux检查流量的命令?,工具,系统,实时,状态,网络,信息,数据,密码,地址,流量,linux如何获得一个进程的网络流量在类Unix系统中可以使用top查看linux检查更新命令是?
linux检查更新命令是?,工作,软件,地址,系统,信息,管理,命令,目录,最新,标准,linux常用命令有哪些linux常用命令如下:查看内核版本:uname-a。控制