如何StackOverflowException使用最少的代码行生成?
我刚刚读到Google Go默认情况下如何使每个线程的堆栈大小减少,然后如果发生溢出则链接到新堆栈(参见此处的第16页).我想知道在C中做到这一点的最好方法.
我不得不说我不是C专家,所以可能有更好的方法来检测C上的Stack Overflow,但是我无知,这就是我认为我会实现它的方式:
我想到的第一件事是每次我们有一个新的堆栈,我们得到一个堆栈变量的地址,并且我们大致有起始堆栈地址.然后我们需要能够检索线程有多少堆栈空间.如果线程不是主线程,这是可能的,但我不知道如何在C上获取此信息.
然后我们需要通过检索当前堆栈变量地址来检查(每个函数调用,它可能是)已经使用了多少堆栈.如果我们检测到可能的堆栈溢出,我们需要有一些方法来创建一个新的堆栈并链接到最后一个堆栈.我认为可以在C中完成的唯一方法是创建一个新线程来执行我们想要的函数,并锁定当前线程直到函数返回其结果.
那么,是否有更清洁/更好的方法来实现这一点?
谢谢!
我有一个表单验证脚本,不幸的是Stack overflow at line 0在崩溃之前不久返回警报框(IE7)并且在IE8中直接崩溃(它确实先工作,非常慢).
我已经为你的测试乐趣做了一个jsFiddle:http://jsfiddle.net/yuNXm/2/在你输入一个需要验证然后失去焦点的输入值之后发生堆栈溢出.(电子邮件字段是ajax驱动的,所以不会在那里运行).
相关的Javascript:
jQuery(document).ready(function($) {
var inputs = $('input[data-validation-method]');
var fields = $();
var classes = ['fail', 'win'];
//Methods of validation, must return an object like so {result: [boolean], message: [string or false]} as a parameter of the callback() function;
var methods = {
'email' : function(field, dependancies, callback) {
var value = field.val();
var response = false;
field.addClass("loading");
$.post(
ajaxData.url,
{
'action':'validate_form',
'value': value,
'method': field.data('method')
},
function(response){
return …Run Code Online (Sandbox Code Playgroud) 这是我在stackoverflow上的第一个问题所以我会尝试具体.我在论坛上搜索了任何相关主题,但没有运气.无论如何这里是:
我正在使用Visual Studio 2005.I遇到堆栈溢出异常:IHR.exe中0x775715de处的未处理异常:0xC00000FD:堆栈溢出.,当试图调试我的项目时.在进入main()函数之前,调用堆栈在ntdll.dll停止时没有帮助.
起初我怀疑它可能是一个编译设置的东西,但是当我将在我的计算机上编译的可执行文件发送到第二台计算机时,它可以正常运行,它只是不能在我的机器上运行.
反过来也是如此,我在第二台计算机上编译了可执行文件,它可以正常运行.但是,当我尝试运行在我的计算机上的第二台计算机上编译的可执行文件时,它无法运行.所有出现的都是一个空白的命令提示符和一条Windows消息,说该程序没有响应.
我使用的是Windows 7 Professional SP1,64位.另一台计算机具有相同的OS版本.由于公司政策,我不能在这里发布任何源代码,但无论如何我认为它与源代码没有任何关系.我怀疑它可能是运行时环境中的问题.感谢任何帮助.谢谢.
以下是调用堆栈中的所有内容:
->ntdll.dll!775715de()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!775715de()
ntdll.dll!7756014e()
Run Code Online (Sandbox Code Playgroud)
感谢@ WhozCraig的建议,我设法在调用堆栈上获得了更有意义的消息.尽管如此仍然难过.
IHR.exe!_mbscmp(const unsigned char*s1 = 0x00fe8c10,const unsigned char*s2 = 0x00fe8c10)第84行+ 0xf字节
IHR.exe!_mbscmp(const unsigned char*s1 = 0x00fe8c10,const unsigned char*s2 = 0x00fe8c10)Line 84 + 0xf字节
IHR.exe!strcmp(const char*_s1 = 0x00fe8c10,const char*_s2 = 0x00fe8c10)行1646 + 0x2b字节
IHR.exe!_mbscmp_l(const unsigned char*s1 = 0x00fe8c10,const unsigned char*s2 = 0x00fe8c10 ,localeinfo_struct*plocinfo = 0x00000000)第58行+ 0xd字节
IHR.exe!_mbscmp(const unsigned char*s1 = 0x00fe8c10,const unsigned char*s2 = …
作为C++编程和计算机系统架构的初学者,我还在学习C++的基础知识.昨天我读到了递归函数,所以我决定写自己的,这是我写的:(非常基础的)
int returnZero(int anyNumber) {
if(anyNumber == 0)
return 0;
else {
anyNumber--;
return returnZero(anyNumber);
}
Run Code Online (Sandbox Code Playgroud)
}
当我这样做时:int zero1 = returnZero(4793); 它会导致堆栈溢出,但是,如果我将值4792作为参数传递,则不会发生溢出.
任何想法为什么?
我正在寻找一个问答网站的模板,比如stackoverflow,最好用PHP编写.有人知道任何开源模板吗?我已经搜索了github,但没有找到任何东西.
提前致谢.
我是Haskell和函数式编程的新手,我有一个程序可以工作但几秒后就会溢出堆栈.我的问题是,我该怎么做?我怎样才能至少得到它出现的位置,打印堆栈或其他什么?
使用以下命令在ghci中运行时程序非常慢:跟踪不会发生堆栈溢出.runhaskell也不会出现这种情况,只会占用越来越多的内存.我只在用ghc编译并执行时才得到错误.
我测试了spark默认的PageRank示例并将迭代设置为1024,然后它抛出stackoverflower.我也在我的其他程序中遇到了这个问题.我怎么能解决它.
object SparkPageRank {
def main(args: Array[String]) {
if (args.length < 3) {
System.err.println("Usage: PageRank <master> <file> <number_of_iterations>")
System.exit(1)
}
var iters = args(2).toInt
val ctx = new SparkContext(args(0), "PageRank",System.getenv("SPARK_HOME"), SparkContext.jarOfClass(this.getClass))
val lines = ctx.textFile(args(1), 1)
val links = lines.map{ s => val parts = s.split("\\s+")
(parts(0), parts(1))
}.distinct().groupByKey().cache()
var ranks = links.mapValues(v => 1.0)
for (i <- 1 to iters) {
val contribs = links.join(ranks).values.flatMap{ case (urls, rank) =>
val size = urls.size
urls.map(url => (url, rank / size)) …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的Java对象,它在内存中表示带有顶点和边的图形.每个顶点都有一个ArrayList与其连接的其他顶点(并且还有一个HashMap数据结构用于其他目的).图形可以有几千个顶点,还有更多边.
当尝试使用Java的内置序列化(implements Serializable等等)来序列化图形时,我总是遇到一个StackOverflowError.设置图表的其他属性transient没有帮助,也没有将堆栈大小设置得更大(即-Xss1g或-Xss512m).
我不认为我需要创建一个自定义writeObject方法,因为ArrayList它HashMap已经拥有自己的实现,这些实现在序列化时调用.
我的问题是:有没有办法在没有得到的情况下序列化已经在内存中的大型Java对象StackOverflowError?
编辑:这是堆栈跟踪:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.reflect.Method.invoke(Method.java:575)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:950)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1482)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1535)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:329)
at java.util.ArrayList.writeObject(ArrayList.java:570)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:950)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1482)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1535)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at …Run Code Online (Sandbox Code Playgroud) 我已经从这个和这个 答案中理解了你的代码可能进入无限循环导致stackOverFlowError的可能情况,但我不明白如何在这里复制相同的场景,
public class A {
private B b = new B();
@Override
public String toString() {
return "b "+b;
}
}
public class B {
private A a = new A();
@Override
public String toString() {
return "";
}
}
public class StackoverflowErrorTest {
public static void main(String[] args) {
A a = new A();
System.out.println(a);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码生成下面的堆栈跟踪: -
Exception in thread "main" java.lang.StackOverflowError
at stackoverflowerror.B.<init>(B.java:5)
at stackoverflowerror.A.<init>(A.java:5)
.
.
.
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当我在main方法中打印对象'a'时,它将调用A类的toString方法,在该方法中,我将返回B类的对象,该对象将隐式调用B类的toString方法.现在,在B类的toString方法中,我返回的是一个空字符串.那么无限循环的范围如何以及在何处进入图片.请解释.