标签: stack-overflow

在Java中尝试/捕获堆栈溢出?

你能尝试/捕获java中的堆栈溢出异常吗?它似乎在抛出自己的方式.当我的程序溢出时,我想"惩罚"那个价值.

java stack-overflow

20
推荐指数
3
解决办法
3万
查看次数

Go怎么没有stackoverflows

我在本演讲中读到了http://golang.org/doc/ExpressivenessOfGo.pdf 第42页:

安全

- 没有堆栈溢出

这怎么可能?和/或Go如何避免这种情况?

stack-overflow stack memory-management language-design go

20
推荐指数
2
解决办法
3907
查看次数

node.js/Express抛出'RangeError:在高负载下超过'最大调用堆栈大小

我们在高负载下运行的节点环境存在问题,而我们无法找到源代码.

一点背景:我们正在使用Express为http框架运行集群节点应用程序.目前,有3个盒子,每个盒子有8个CPU核心,每个盒子运行一个由6个节点工作者组成的集群.设置似乎很好,我已经研究了所有建议的方法,我相信设置是可靠的.我们使用Express 2.5.11和XMLHttpRequest 1.4.2运行node.js 0.8.1.

问题在于:我们正在对该产品进行"暗启动"测试(即浏览器客户端代码在后台对我们的API调用javascript ajax,但未在页面上使用或向用户显示).成功运行几分钟后,系统抛出:

[RangeError: Maximum call stack size exceeded]
Run Code Online (Sandbox Code Playgroud)

我们正在使用集群控制器(启动每个worker)中的'uncaughtException'事件来捕获错误,但是在该级别没有可用的堆栈跟踪.我已经对这个问题进行了广泛的研究,似乎找不到任何有类似错误的人.梳理完系统中的每一行代码后,这就是我所知道的:

  • 我找不到任何递归或循环引用.(我已经读过这个错误并不总是意味着一个递归问题,但我们已经检查过了;我们实际上已经通过删除大部分代码来运行测试,但它仍然会发生,见下文);
  • 我已经下到每个盒子1个工作进程尝试消除群集作为一个问题 - 问题仍然发生;
  • 这个问题只发生在高负荷下.我们的交通量约为.每秒1500页,在繁忙的交通时间内,每秒可达到15000页(我们无法在开发环境中复制);
  • 捕获错误的时间有所不同,但通常在15分钟内;
  • 该错误似乎不会影响操作!通过这个,我的意思是没有腐败的反应,除了偶尔的超时,系统永远不会崩溃;
  • 陷阱错误的工作进程会在几秒钟后恢复并再次开始提供请求;
  • 我在最基本的设计上遇到了错误 - 没有调用其他API.只需提出请求并回复简单的json响应即可.这是最奇怪的部分.在我的任何代码中,系统似乎都没有失败 - 如果没有实例化任何类来完成实际工作,它就会失败.显然,我开始使用更多的代码,但是慢慢地将它们分开,直到它仍然在一个简单的设置下失败.

我认为,最明显的症状是错误总是在请求完全服务之后发生.也就是说,服务器接收请求,找到正确的Express路由,调用res.send,并且完成.这对我来说真的像垃圾收集!我已经读过V8引擎有一个非常好的GC引擎,但我想知道我们的重负荷是多少影响了事情.

正如我所说,即使在基本设计上,代码也会抛出错误.取出大部分自定义代码后,这就是设置的基础知识.很抱歉,我正在这里切割,所以并不是所有的变量声明等都会被包含在内,但代码确实有效,所有这些东西都在真正的代码中:

集群控制器.这是在命令行上启动的清理版本.

cluster = require('cluster');
path = require('path');
fs = require('fs');
app = require('./nodeApi');
_ = require('underscore');
nodeUtil = require(./nodeUtil);

process.on('uncaughtException', function(err) {
  var stamp;
  stamp = new Date();
  console.log("***************************** Exception Caught, " + stamp);
  return console.log("Exception is:", err);
});

if (cluster.isMaster) {
  if ((nodeUtil.isLiveServer() || nodeUtil.isCluster()) && process.env.IS_CLUSTER !== …
Run Code Online (Sandbox Code Playgroud)

javascript stack-overflow garbage-collection node.js express

20
推荐指数
1
解决办法
6753
查看次数

在IQueryable上调用ProjectTo <T>()时,AutoMapper抛出StackOverflowException

我使用EF Code First创建了具有彼此集合的类.实体:

public class Field
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<AppUser> Teachers { get; set; }
    public Field()
    {
        Teachers = new List<AppUser>();
    }
}

public class AppUser
{
    public int Id { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string UserName => Email;
    public virtual List<Field> Fields { get; set; }
    public AppUser()
    {
        Fields …
Run Code Online (Sandbox Code Playgroud)

c# stack-overflow entity-framework automapper ef-code-first

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

C#:如何测试StackOverflowException

假设您有一种方法可能会陷入无休止的方法调用循环并且崩溃并发生StackOverflowException.例如,我RecursiveSelect这个问题中提到的天真方法.

从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,默认情况下会终止相应的进程.因此,建议用户编写代码以检测并防止堆栈溢出.例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环.

把这些信息(来自这个答案)考虑在内,因为无法捕获异常,是否可以为这样的事情编写测试?或者对此进行测试,如果失败,实际上会打破整个测试套件?

注意:我知道我可以尝试一下,看看会发生什么,但我对它的一般信息更感兴趣.比如,不同的测试框架和测试运行器会以不同的方式处理吗?即使有可能,我应该避免这样的测试吗?

c# stack-overflow nunit unit-testing

18
推荐指数
1
解决办法
2308
查看次数

如何避免Haskell中的堆栈溢出?

Haskell不支持循环计算,而是提供使用递归算法.但是这种方法导致堆栈增长,甚至堆栈溢出.我认为应该有办法解决这个问题.这是样本.我想知道,每5秒可以调用多次getClockTime:

import System.Time

nSeconds = 5

main = do
    initTime <- totalPicoSeconds `fmap` getClockTime
    doWork initTime 1
    where
    doWork initTime n = do
        currTime <- totalPicoSeconds `fmap` getClockTime
        if (currTime - initTime) `div` 10 ^ 12 >= nSeconds
            then print n
            else doWork initTime (n+1)

totalPicoSeconds :: ClockTime -> Integer
totalPicoSeconds (TOD a b) = a * 10 ^ 12 + b
Run Code Online (Sandbox Code Playgroud)

该程序耗时5秒,但最终我得到了:

堆栈空间溢出:当前大小为8388608字节.
使用`+ RTS -Ksize -RTS'来增加它.

在特定情况下,手动管理堆栈大小可能有所帮助,但如果我希望运行此算法10秒钟,它可能会再次溢出.所以这不是一个解决方案.我怎样才能使这段代码有效?

stack-overflow recursion haskell

18
推荐指数
1
解决办法
3030
查看次数

Pattern.matches()给出了StackOverflowError

我正在使用java的Pattern.matches将数据块与正则表达式进行匹配.数据块可以是单行或多行.问题是,一旦我的数据超过15行(通常超过17-18行),我开始得到stackoverflower.对于少于15行的数据,正则表达式工作正常.

正则表达式的格式为:
domainname - > space - >, - > space - > number - > space - >, - > space - > number - > newline

String regex = "^(([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+([a-zA-Z]{2,})\\s*,\\s*\\d+\\s*,\\s*\\d+(\\r?\\n)?)+$";
Run Code Online (Sandbox Code Playgroud)

我用来测试这个正则表达式的数据块就是这个

abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, …
Run Code Online (Sandbox Code Playgroud)

java regex stack-overflow

18
推荐指数
1
解决办法
1815
查看次数

具有显式finalName的Maven将无法正常工作

1.背景

我的Maven项目有很多的模块和子模块与jarswars一切工作.我也可以在服务器上部署它而没有任何问题.

我决定遵循这个maven命名转换,我正在进行一些测试project.nameproject.build.finalName拥有一个合适的名称.

我定义project.name为根工件创建的模式是company-${project.artifactId},对于模块和子模块是${project.parent.name}-${project.artifactId}:

  • 公司的任何伪影的任何-模块1
  • 公司的任何伪影的任何-模块2-任何-submodule1
  • 公司的任何伪影的任何-模块2-任何-submodule2

模式project.build.finalName${project.name}-${project.version}:

  • 公司的任何伪影的任何-module1-1.0.jar
  • 公司的任何伪影的任何-模块2-任何-submodule1-2.0.jar
  • 公司的任何伪影的任何-模块2-任何-submodule2-3.0.war

但maven没有生成这些文件,而是给了我一个StackOverflowError.

2.重现错误的示例

你可以从github克隆这个例子:https://github.com/pauloleitemoreira/company-any-artifact

在github中,有一个master分支,它将重现此错误.还有only-modules分支,这是一个工作示例,用于${project.parent.name}生成finalName我想要的jar .

让我们考虑一个带有一个根pom工件,一个pom模块和一个子模块的maven项目.

-any-artifact
     |
     |-any-module      
           |
           |-any-submodule
Run Code Online (Sandbox Code Playgroud)

2.1任何神器

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.company</groupId>
    <artifactId>any-artifact</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <name>company-${project.artifactId}</name>

    <modules>
        <module>any-module</module>
    </modules>

    <!-- if remove finalName, maven will not …
Run Code Online (Sandbox Code Playgroud)

java stack-overflow maven maven-package

18
推荐指数
1
解决办法
6488
查看次数

为什么简单地使用State monad会导致堆栈溢出?

我正在玩State monad,我不知道在这段简单的代码中是什么导致了堆栈溢出.

import Control.Monad.State.Lazy

tick :: State Int Int
tick = do n <- get
         put $! (n+1)
         return n

million :: Int
million = snd $ runState (mapM_ (const tick) [1..1000000]) 0

main = print million
Run Code Online (Sandbox Code Playgroud)

注意 我只想知道在这段代码中导致问题的原因,任务本身本身并不重要.

stack-overflow monads haskell state-monad

17
推荐指数
1
解决办法
1830
查看次数

(正向)管道操作员是否可以阻止尾调用优化?

对于工作中的参数优化问题,我写了一个遗传算法来找到一些好的设置,因为蛮力解决方案是不可行的.不幸的是,当我早上回来时,大部分时间我都会被送到StackOverflowException.

我已经使用F#已经有一段时间了所以我知道TCO和需要带累加器参数的函数,并且通常使用该形式.

经过大量的搜索,我认为我能够找到触发异常的代码:

breedPopulation alive |> simulate (generation + 1) lastTime ewma
Run Code Online (Sandbox Code Playgroud)

breedPopulation从当前个体中生成新一代alive.然后通过调用开始下一轮/生成simulate.当我看到反汇编(总noob)时,我发现了一些pop和a ret,所以它看起来不像是对我的常规(非尾部)调用.

mov         rcx,qword ptr [rbp+10h]  
mov         rcx,qword ptr [rcx+8]  
mov         rdx,qword ptr [rbp-40h]  
cmp         dword ptr [rcx],ecx  
call        00007FFA3E4905C0  
mov         qword ptr [rbp-0F0h],rax  
mov         r8,qword ptr [rbp-0F0h]  
mov         qword ptr [rbp-80h],r8  
mov         r8,qword ptr [rbp-78h]  
mov         qword ptr [rsp+20h],r8  
mov         r8d,dword ptr [rbp+18h]  
inc         r8d  
mov         rdx,qword ptr [rbp+10h]  
mov         r9,qword ptr [rbp-20h]  
mov         rcx,7FFA3E525960h  
call        00007FFA3E4A5040 …
Run Code Online (Sandbox Code Playgroud)

stack-overflow f# cil tail-recursion tail-call-optimization

17
推荐指数
1
解决办法
236
查看次数