标签: stack-overflow

调试单元测试由于StackOverflow异常而失败

每当单元测试由于StackOverflowException单元测试过程立即退出而失败时- 找出发生的事情(我所知道的)的唯一方法是调试通过遵循这里找到的步骤获得的单元测试过程的故障转储

获取在StackOverflowException抛出时运行的单元测试名称的最简单方法是什么?即使在调试单元测试时,我也很难找到当前单元测试的名称,因为它在堆栈的底部并且Visual Studio不会在调试窗口中显示整个堆栈,因为它太大了.

有没有办法找出哪个单元测试失败而没有收集和调试崩溃转储?

.net c# stack-overflow unit-testing

14
推荐指数
1
解决办法
1497
查看次数

致命的 Python 错误:无法从堆栈溢出中恢复

我在互联网上阅读了类似的问题,但没有一个答案可以帮助我。我有一个函数,可以为每一行数据(数据大约有 2'000'000 行)做一些事情,然后根据它所做的事情用不同的参数调用相同的函数。问题是,过了一会儿,我在终端中收到此错误:“致命的 Python 错误:无法从堆栈溢出中恢复。”

看起来导致这个错误最常见的错误是无限循环,但我控制并没有无限循环。因此,对我来说,'sys.getrecursionlimit()' 设置为 3000 的问题,这意味着在 3000 次调用同一函数后,它会给我错误。

首先,我不明白“致命的 Python 错误:无法从堆栈溢出中恢复”之间的区别。在终端中,或在 jupyternotebook 中出现“RecursionError:比较时超出最大递归深度”。事实上,对我来说它可能来自同样的错误(例如无限循环)。

当用一个简单的名为“test_”的函数替换我的函数时,我有以下代码:

import sys
print(sys.getrecursionlimit())

def test_(x,t):
    x = x+1
    if x<t:
        test_(x=x,t=t)

print(test_(0,2971)) # output: None
print(test_(0,2972)) # RecursionError: maximum recursion depth exceeded in comparison
Run Code Online (Sandbox Code Playgroud)

3000

没有任何

-------------------------------------------------- ------------------------- RecursionError Traceback (最近调用 last) in () 8 9 print(test_(0,2971)) --- > 10 打印(test_(0,2972))

在 test_(x, t) 5 x = x+1 6 if x 7 test_(x=x,t=t) 8 9 打印(test_(0,2971))

... 重复最后 1 帧,从下面的帧开始...

在 test_(x, t) …

python stack-overflow recursion

14
推荐指数
1
解决办法
2万
查看次数

主函数执行时的C++堆栈溢出异常

我有下面列出的代码,并在运行时报告堆栈溢出.我使用pass by value来showTest().我期望它会将Test结构的副本复制到堆栈(推送到堆栈),然后在函数调用结束时Test释放结构(弹出堆栈).所以我打三次电话.它应该推入堆栈并在每个函数调用结束时弹出.

如果每次调用函数时它都会按下并弹出堆栈,我看不到任何堆栈问题.但是,当我运行此代码时,它会在第一行报告堆栈溢出异常main.(我使用Visual Studio 2017.)

如果我删除其中一个showTest()函数调用,那么我可以让它工作.

任何反馈都将受到高度赞赏.

#include <iostream>

struct Test
{
  static int Userid;
  int data[100000] = { };

  Test()
  {
    ++Userid;
  };
};

int Test::Userid = 0;

void showTest(Test i_myint)
{
  std::cout << "test" << std::endl;
}

int main()
{
  Test *pint = new Test();
  showTest(*pint);
  Test *pint2 = new Test();
  showTest(*pint2);
  Test *pint3 = new Test();
  showTest(*pint3);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ stack-overflow

14
推荐指数
1
解决办法
1875
查看次数

Windows:避免在堆栈上推送完整的x86上下文

我已经实现了PARLANSE,这是MS Windows下的一种语言,它使用cactus栈来实现并行程序.堆栈块被分配在每个功能的基础上,并处理局部变量的大小合适,表达温度推/持久性有机污染物,并调用库(包括存储库程序工作在堆栈空间).在实践中,这样的堆栈帧可以小到32个字节,并且通常是这样.

这一切都很有效,除非代码做了一些愚蠢的事情并导致硬件陷阱......此时Windows似乎坚持在堆栈上推送整个x86机器上下文.如果包含FP/MMX /等,则大约500多个字节.寄存器,它做的.当然,32字节堆栈上的500字节推送会破坏它不应该的东西.(硬件在陷阱上推了几个字,但不是整个上下文).

[编辑2012年11月27日:请参阅测量的细节上堆叠的荒谬量Windows实际上推动 ]

我可以让Windows在其他地方存储异常上下文块(例如,到特定于线程的位置)吗?然后软件可以对线程进行异常命中并处理它而不会溢出我的小堆栈帧.

我不认为这是可能的,但我想我会问更多的观众.是否有OS标准调用/接口可能导致这种情况发生?

如果我可以让MS让我的进程可选地定义一个上下文存储位置"contextp",那么在操作系统中这样做是微不足道的,这个位置被初始化以默认启用当前的遗留行为.然后替换中断/陷阱向量代码:

  hardwareint:   push  context
                mov   contextp, esp
Run Code Online (Sandbox Code Playgroud)

...... ......

  hardwareint:  mov <somereg> contextp
                test <somereg>
                jnz  $2
                push  context
                mov   contextp, esp
                jmp $1 
         $2:    store context @ somereg
         $1:    equ   *
Run Code Online (Sandbox Code Playgroud)

保存somereg等所需的明显变化

[我现在做的是:检查每个函数的生成代码.如果它有可能生成陷阱(例如,除以零),或者我们正在调试(可能是坏指针deref等),请为FP上下文添加足够的空间到堆栈帧.堆栈帧现在最终大小约为500-1000字节,程序无法递归到目前为止,这对我们正在编写的应用程序来说有时是一个真正的问题.所以我们有一个可行的解决方案,但它使调试变得复杂]

编辑8月25日:我已经成功地将这个故事告诉了一位微软的内部工程师,他有权明确地找出MS中谁可能真正关心的人.解决方案可能有微弱的希望.

编辑9月14日:MS Kernal Group Architect听过这个故事并且很有同情心.他说MS将考虑一个解决方案(如提议的解决方案),但不太可能在服务包中.可能必须等待下一版本的Windows.(叹气......我可能会变老......)

编辑:2010年9月13日(1年后).微软没有采取任何行动.我最近的噩梦:在Windows X64上运行一个32位进程的陷阱,在中断处理程序伪造推动32位上下文之前,将整个X64上下文推送到堆栈上?那甚至更大(两倍宽的整数寄存器,两倍的SSE寄存器(?))?

编辑:2012年2月25日:( 1.5年过去了......)微软没有反应.我猜他们只是不关心我的并行性.我认为这对社区不利; MS在正常情况下使用的"大堆栈模型"限制了通过食用大量VM可以在任何一个瞬间生存的并行计算量.PARLANSE模型将允许一个应用程序在运行/等待的各种状态下具有一百万个活"谷粒"; 这在我们的一些应用程序中确实发生,其中"并行"处理了1亿个节点图.PARLANSE方案可以使用大约1Gb的RAM来实现这一点,这是非常易于管理的.如果您尝试使用MS 1Mb"大堆栈",那么您只需要10 ^ 12个字节的VM用于堆栈空间,我非常确定Windows不会让您管理一百万个线程.

编辑:2014年4月29日:( 4年过去了). 我想MS只是不读SO. 我已经在PARLANSE上完成了足够的工程设计,因此我们只需要在调试期间支付大型堆栈帧的价格,或者当FP操作正在进行时,所以我们设法找到非常实用的方法来实现这一点.MS继续令人失望; 各种版本的Windows推送到堆栈上的东西量似乎变化很大,而且非常严重地超出了对硬件环境的需求.有一些暗示,这种可变性是由于非MS产品坚持(例如防病毒)在异常处理链中嗤之以鼻; 为什么他们不能从我的地址空间之外做到这一点?任何,我们通过简单地为FP /调试陷阱添加一个大的slop因子,并等待超过该数量的字段中不可避免的MS系统来处理所有这些.

stack-overflow assembly exception cpu-registers threadcontext

13
推荐指数
1
解决办法
1556
查看次数

打开Eclipse Android Layout Editor时出错

从昨天起我每次在Eclipse中为Android UI打开布局编辑器时都会遇到以下异常:

未处理的事件循环异常

    java.lang.StackOverflowError
    at com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationComposite.isTheme(Unknown Source)
    at 
    com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationComposite.isTheme(Unknown Source)
    at... 
Run Code Online (Sandbox Code Playgroud)

如果发生Stackoverflow异常,最后一部分会按预期继续.

有没有其他人经历过这个并找到了解决方案?我正在使用Eclipse 3.5.2在Mac OS X上使用最新的android sdk

我刚安装了eclipse的Carbon版本,即使在这个全新的eclipse副本中我也遇到了这个错误.

非常奇怪,我是唯一遇到此错误的人.也许这不是Eclipse问题,而是我的项目设置问题......

eclipse stack-overflow android

13
推荐指数
1
解决办法
5760
查看次数

为什么堆栈溢出会导致分段错误而不是Linux中的堆栈溢出?

可能重复:
分段错误和堆栈溢出之间有什么区别?

我只是想知道,为什么堆栈溢出导致分段错误而不是堆栈溢出.

是因为堆栈限制的边界被交叉导致SIGSEGV?为什么我们在Linux中没有遇到堆栈溢出,而是一个分段错误?

int foo()
{
  return foo();
}
Run Code Online (Sandbox Code Playgroud)

这个小代码应该导致堆栈溢出,但它会导致Linux中的分段错误.

c linux stack-overflow

13
推荐指数
2
解决办法
1万
查看次数

Windows服务/无法创建堆栈的新保护页面

我有一个Windows服务,每隔一分钟做一些密集的工作(实际上它每次启动一个新的线程,它通过http同步到不同的系统).问题是,几天后突然停止,没有错误信息.

我有NLog,我已注册'AppDomain.CurrentDomain.UnhandledException'.textfile-log中的最后一个条目只是一个正常的条目,没有任何问题.查看EventLog,我也无法在应用程序日志中找到任何消息,但是,系统日志中有两个条目.

一个人基本上说服务意外终止了.而已.第二个事件(与第一个事件同时)说:"......无法创建堆栈的新保护页面......"

从我读过的内容来看,这可能是堆栈溢出异常.我没有解析任何XML而且我不做递归工作.我使用Gate,Nancy和SignalR托管一个Web服务器,并使RavenDB以嵌入模式运行.每分钟都使用.NET 4.0中的Taskfactory启动一个新任务,我还有一个ContinueWith,我重新启动System.Timers.Timer,在一分钟内再次启动.

我该如何开始调查此问题?可能出现这种错误的原因是什么?

c# stack-overflow debugging clr windows-services

13
推荐指数
1
解决办法
6万
查看次数

为什么我没有堆栈溢出?

编辑在你兴奋之前,最后看到重要的编辑,如果你仍然好奇,这些被报道为:


我一直在尝试一段代码,并惊讶地发现我没有得到堆栈溢出.试图简化我甚至得到的东西:

#include <stdio.h>

int main()
{
    int i;

    /* 1,500,000,000 x 4 bytes = 6,000,000,000 bytes = 6GB */
    int size = 1500000000;
    int arr[size];
    for (i = 0; i < size; i++) {
        arr[i] = 1;
    }
    printf("first: %d\n", arr[0]);
    printf("last:  %d\n", arr[size - 1]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这使我怀疑我甚至不知道内存管理的基础知识.我认为arr[size]应该轻松分配堆栈和溢出,但它使用我的所有内存和交换并成功完成.我错过了什么?

笔记

  • 我在64位ubuntu 12.04上运行
  • 我试过gccclang版本:

    gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
    Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)
    
    Run Code Online (Sandbox Code Playgroud)
  • 我关闭了优化(-O0) …

c memory stack-overflow memory-management

13
推荐指数
1
解决办法
537
查看次数

为什么嵌套一堆块会导致JavaScript中的堆栈溢出

我的代码{}在JavaScript中是完全合法的,因为它代表一个.

但是,我注意到{{...}}在Chrome*中将很多块()嵌套在另一个加注中:

未捕获RangeError:超出最大调用堆栈大小

为什么堆栈溢出发生在这里?


这是一个说明问题的本(jsfiddle崩溃).

在JSRoom询问时,Zirak发现魔术数字在Chrome 上为3913块,在Firefox 上为2555块.

什么被推到了堆栈?为什么?


(*)我已经检查过,它也发生在IE和Firefox中

更新:我已经检查过并且不可靠IE可以避免堆栈溢出异常.它抛出了两次而不是第三次.如果任何一个读者有IE并且愿意测试它的旧版本(比如IE8和9)并告诉我发生了什么,我真的很感激.

javascript stack-overflow

13
推荐指数
2
解决办法
429
查看次数

C++ - 本地堆栈数组与动态分配

用C/C++编程时; 根据经验,什么是切断点,而不是char array[MAX_PATH+1]={0}一个人会使用:

 char *array=nullptr;

 array=new char [MAX_PATH+1];

 ...code...

 delete [] array;
Run Code Online (Sandbox Code Playgroud)

人们在什么时候采取行动来保留堆叠上的空间?

20年前,我被告知你应该在堆上分配超过32个字节的所有数组,无论性能成本如何,并为简单变量保存堆栈.我已经看到很多现代示例代码非常使用堆栈,所以这种想法改变了吗?

c++ stack-overflow

13
推荐指数
2
解决办法
772
查看次数