相关疑难解决方法(0)

Cmake改变堆栈大小

有没有办法从Cmake更改堆栈大小?
我只找到一个论坛帖子提到CMAKE_CXX_STACK_SIZE,但找不到该命令的文档。理想情况下,该命令应适用于Visual Studio C++gcc

stack gcc cmake stack-size visual-studio

9
推荐指数
1
解决办法
9229
查看次数

Linux 进程堆栈被局部变量溢出(堆栈保护)

_chkstk() 函数的目的是什么?

在堆栈的末尾,有一个保护页被映射为不可访问的内存——如果程序访问它(因为它试图使用比当前映射更多的堆栈),就会出现访问冲突。

_chkstk() 是一个特殊的编译器辅助函数,它

确保局部变量有足够的空间

即它正在做一些堆栈探测(这是一个LLVM 示例)。
这种情况是特定于 Windows 的。所以Windows有一些解决问题的方法。

让我们考虑 Linux(或其他一些类 Unix)下的类似情况:我们有很多函数的局部变量。第一个堆栈变量访问在堆栈段后面(例如mov eax, [esp-LARGE_NUMBER],这里 esp-LARGE_NUMBER 是堆栈段后面的内容)。是否有任何功能可以防止可能的页面错误或 Linux(可能是其他类 Unix)或开发工具(如等)中的任何功能?-fstack-checkGCC 堆栈检查)是否以某种方式解决了这个问题?这个答案表明它与_chkstk().

PS 这些帖子12没有多大帮助。

PPS 一般来说,问题是关于操作系统(最重要的Linux与 Windows)之间的实现差异,这些方法与大量堆栈变量斗争,爬到堆栈段后面。添加 C++ 和 C 标记是因为它是关于 Linux 本地二进制生成的,但汇编代码与编译器相关。

c linux assembly gcc stack-memory

9
推荐指数
1
解决办法
314
查看次数

尽管有无限的ulimit,为什么非常大的堆栈分配会失败?

以下静态分配给出了分段错误

double U[100][2048][2048];
Run Code Online (Sandbox Code Playgroud)

但是下面的动态分配很顺利

double ***U = (double ***)malloc(100 * sizeof(double **));

for(i=0;i<100;i++)
{
    U[i] = (double **)malloc(2048 * sizeof(double *));
    for(j=0;j<2048;j++)
    {
        U[i][j] = (double *)malloc(2048*sizeof(double));
    }
}
Run Code Online (Sandbox Code Playgroud)

ulimit在linux中设置为无限制.

有人能给我一些关于发生什么的暗示吗?

c linux memory-management

8
推荐指数
1
解决办法
1669
查看次数

将boost :: thread与C++ 11 std :: mutex混合使用是否安全?

std::mutex在通过boost启动其线程的程序中使用它和它的亲属是否安全?

(使用std::thread对我来说不是一个选项(我认为),因为应用程序需要大量的堆栈空间,并且在某些平台上需要在创建时覆盖默认的堆栈大小.)

c++ multithreading boost c++11

8
推荐指数
1
解决办法
324
查看次数

C中允许的最大静态数组大小是多少?

在我的算法中,我知道使用静态数组,没有动态数组.但我有时会达到堆栈的极限.我是对的,静态数组是否存储到堆栈中?

哪个参数会影响一个C程序的最大堆栈大小?

是否存在影响最大阵列大小的系统参数?最大化没有.元素取决于数组类型?它取决于系统总RAM吗?或者每个C程序都有一个静态的最大堆栈大小?

c arrays stack max

6
推荐指数
2
解决办法
9838
查看次数

减少内存分配GCC命令

今天,在我的计算机sciene课程中,我被告知我可以调整程序在编译期间可以分配的内存量(使用GCC,Linux).默认情况下,此数量设置为最佳模式(这意味着尽可能多).

在调试我的应用程序期间,我可以从这个编译器功能中受益匪浅,因为我需要正确处理分配错误,这在我的具有超过16 GB RAM的PC上非常棘手.

有谁知道这个选项是什么?我希望gcc --maxalloc 1024,这意味着我的程序将能够分配最多1024字节的内存.

c++ linux gcc memory-management

4
推荐指数
1
解决办法
4304
查看次数

数组崩溃超过120000个元素

当我做:

vector<double> myVect(120000000, 0);
Run Code Online (Sandbox Code Playgroud)

我可以让矢量看起来像我想要的那么多元素.但是,当我这样做时:

double myArray[120000];
Run Code Online (Sandbox Code Playgroud)

在我的程序崩溃之前,我被限制在大约120000-130000个元素的某个地方.有什么东西搞砸了或阵列真的有限吗?

c++ arrays

4
推荐指数
1
解决办法
2975
查看次数

减少调试会话中的堆栈大小以捕获无限递归

我有一个算法,“有时”不会破坏递归并最终导致堆栈溢出。现在我想调试这种情况。gdb 直接将我指向覆盖堆栈边界的行,但不可能获得堆栈跟踪,因为 gdb 需要无尽的时间来展开堆栈并将其显示在 ddd 中。

我现在只想减少堆栈大小以更早地获得损坏。所以我需要一种方法来减少我正在运行的任务的堆栈。不涉及任何线程,因此应该不是什么大问题。

但我不知道 gdb 本身是否有一个选项来操纵堆栈(大小)本身,或者我需要在程序启动时以编程方式更改大小,或者我可以在启动后从操作系统命令行(linux)减小大小调试会话。

如果 gdb 有这样的选项,也许调用树达到最大深度时也可能停止。

c++ linux stack-overflow recursion gdb

4
推荐指数
1
解决办法
1010
查看次数

在Windows上以编程方式设置堆栈大小

是否有可能在WinAPI中为运行时的当前线程设置堆栈大小,就像setrlimit在Linux上一样?我的意思是增加当前线程的保留堆栈大小,如果它对于当前要求来说太小了.这是一个可以被其他编程语言的线程调用的库,因此在编译时不能选择设置堆栈大小.

如果没有,任何关于像汇编蹦床这样的解决方案的想法会将堆栈指针更改为动态分配的内存块?

常见问题:代理线程是一个万无一失的解决方案(除非调用者线程的堆栈非常小).但是,线程切换似乎是性能杀手.我需要大量的堆栈用于递归或_alloca.这也是为了提高性能,因为堆分配很慢,特别是如果多个线程并行地从堆中分配(它们被相同的libc/ CRT互斥锁阻塞,因此代码变为串行).

c++ memory winapi stack setrlimit

4
推荐指数
2
解决办法
969
查看次数

如何在使用C时弄清楚Linux中的剩余堆栈

我正在研究一个倾向于使用大量堆栈内存的程序.有没有办法可以找出堆栈上的剩余空间?这是在linux平台上.

谢谢!!

c linux stack-overflow

3
推荐指数
1
解决办法
654
查看次数