Tag: stack overflow

C#中的调用堆栈限制

我想知道在我们得到堆栈溢出exception之前我们可以在c#中执行多少调用 所以我决定写下面的代码 static void Method2(int Calls) { if(!Calls.Equals(0)) Method1(–Calls);//if more calls remain call method1 and reduce counter } static void Method1(int Calls) { if (!Calls.Equals(0))//if more calls remain call method2 and reduce counter Method2(–Calls); } static void Main(string[] args) { var Calls= 42994;//number of calls(stack overflow appears for large number) Method1(Calls); } 我的问题是编译器如何决定抛出堆栈溢出exception是关于内存限制的? 一旦我把42995我得到stackoverflow但这个数字不是恒定所以这是如何工作的?

C#无法捕获StackOverflowException或查看它发生的位置

我知道这很模糊,但这是我能收集到的。 我希望有人能够了解这可能会如何发生。 我有一个64位程序,我在Win 7 64bit机器上运行,内置在Visual Studio 2012中。 它使用位于另一个项目中的类(编译为dll)。 该类有一个错误的迭代器,可能导致堆栈溢出。 调用该buggy迭代器的操作是通过任务调用的。 所以在我的程序中,代码如下所示: new Task(()=>{ try { DoWork(); //<– buggy iterator is called inside } catch (Exception ex) { //Exception reported to user } }).Start(); 代码每次都在相同的数据上执行,并且没有随机变量或guid生成,所以每次都应该产生相同的输出。 大多数情况下,它会在未知模块中发生StackOverflowException崩溃(尽管我知道它确实发生的地方)。 如果发生这种情况,我无法查看发生溢出的代码中的点,并且try-catch块什么都不做! 我无法继续执行该程序(如果我在没有调试的情况下运行它,它会显示“程序必须关闭以便在线检查解决方案”系统窗口)。 现在,它有时会捕获exception(显示导致exception的代码中的正确位置)。 这是随机的,但如果我更频繁地破坏任务(比如在工作期间随机插入断点),似乎会发生更多。 但是,我还是无法继续申请。 即使exception发生在一个try-catch块中,它应该捕获StackOverflowException(它应该捕获它,因为StackOverflowException包含在Exception中 – C#不会让你捕获它们并明确告诉你SOE已经包含在E中)。 我尝试制作一个小程序,在try-catch块内部故意堆栈溢出,它还显示“程序必须关闭,让我在线检查解决方案”系统窗口,而不是正确处理。 这是代码: private bool Overflow() { return Overflow(); } private void button1_Click(object […]

修复System.TypeInitializationException错误是什么以及如何修复?

private static void Main(string[] args) { string str = null; Logger.InitUserLogWithRotation(); // <— error occur … } 当我构建项目时,它没有错误。 但是当我执行它时,它总是中止。 我试图调试项目,但第一行发生了System.TypeInitializationException错误。 我已经尝试过谷歌搜索,但没有找到解决方案。 似乎任何变量初始化代码都是错误的,但找不到它。 请帮我。 我是C#的新手。 谢谢。 ※这是记录器类代码 public class Logger { private static int HDLOG_PRIORITY_DEBUG = 4; private static int HDLOG_PRIORITY_ERROR = 1; private static int HDLOG_PRIORITY_FATAL = 0; private static int HDLOG_PRIORITY_INFO = 3; private […]

List 初始化触发“由于StackOverflowException,进程终止”

我有类似下面的结构,当我进行初始化时: ArrayList nodesMatrix = null; List vertexMatrix = null; List odwiedzone = null; List priorityQueue = null; vertexMatrix = new List(nodesNr + 1); nodesMatrix = new ArrayList(nodesNr + 1); odwiedzone = new List(nodesNr + 1); priorityQueue = new List(); arr.NodesMatrix = nodesMatrix; arr.VertexMatrix = vertexMatrix; arr.Odwiedzone = odwiedzone; arr.PriorityQueue = priorityQueue; //only here i have […]

查询对象时linq to sql + stackoverflowexception

好的,我已经确认我只有这个问题,当我尝试查询主键,如果实体中的主键设置为’自动生成的值’ – 但没有这个,我怎么能插入? 对不起,如果这是一个菜鸟linq2sql但我刚开始使用它。 如何在关闭此选项的情况下使用Linq to Sql,还让db处理pk? 我不想每次都要qry得到pk我应该分配… 我希望有人可以帮助我,我完全无法在我的一个项目中使用linq到sql,不确定要做什么…这是一个例子,这行引发了StackOverflowexception。 MyDataContext dc = new MyDataContext(ConnStr); var obj = dc.MyDataTable.AsQueryable().SingleOrDefault(a => a.pkID == 4); – 第二行抛出StackOverflowexception。 下面是使用相同datacontext的另一个示例 var o = dc.MyDataTable.Take(1); <– works fine var abc = o.ToArray(); <– unable to evaluate, debugger stops 我有什么想法可以尝试吗? 我似乎很好在同一个解决方案中使用linq to sql在另一个项目中。 – 更新 – 我忘了提到这个特定的实体’MyDataTable’将pk设置为’自动生成的值’ – 我设置为这个因为我有sql做自动增量,这是标识列。

为什么这个Linq代码总是抛出System.StackOverflowException?

//A query to a local object var deletionCommands = commands .Where(a => a.Operation != Operation.Addition) .Select(a => new { a.Prestador.cod_prestador, a.Prestador.cod_desdobramento }) ; //A Linq-To-SQL query var toDelete = db.Prestadors .Where(a => deletionCommands.Contains(new { a.cod_prestador, a.cod_desdobramento })) ; db.Prestadors.DeleteAllOnSubmit(toDelete); db.SubmitChanges(); 解决问题的唯一方法是显式循环: foreach (var command in commands) { if(command.Operation != Operation.Addition) { var toDelete = db.Prestadors […]

使用官方c#驱动程序在mongodb中保存具有双向关系的对象

我有两个这样的课: public Class Company { public IList Employees; } public Class Employee { public Company WorkPlace; } 当我想保存类公司的对象时: MongoDatabase Database = MongoServer.GetDatabase(“db”); var workPlace = new Company(); var employee = new Employee { WorkPalce = workPlace} workPlace.Employees = new List{ employee }; Database.GetCollection(“company”).Save(workPlace); 将抛出StackOverFlowexception。

使用c ++ dll在c#app中堆栈溢出

我有一个使用c ++ / cli托管dll的ac#程序。 该DLL包含许多遗留代码,包含相当多的win32窗口。 问题是,dll中的窗口需要比平均咳嗽更多的堆栈空间。 由于这些不是后台进程而是win32 api我需要扩大GUI线程的堆栈大小(至少我认为dll中的win32 api将使用主gui进程)。 所以我需要一种方法来扩大ac#process中GUI线程的大小。 由于我没有找到任何设置来实现这一点,我从命令行尝试了editbin / STACK,这是有效的。 问题是,它只能在命令行中运行,如果我尝试将其作为post-build-step输入,由于某种原因二进制的堆栈大小不会改变,即使postbuild步骤正确执行并且没有抛出错误:( editbin.exe /STACK:2097152 $(TargetPath) (Editbin.exe在路径中,输出窗口中没有错误) 那么如何为我的c ++ dll获得更多的堆栈大小? [更新] 我注意到使用editbin.exe时出现问题。 这在命令行和后期构建步骤中都不起作用: editbin.exe /STACK:2097152 c:\some\path\bin\release\app.exe 这在命令行中有效,但不能作为构建步骤: editbin.exe /STACK:2097152 app.exe 但我需要它作为后期构建步骤。 我试着把它放到一个批处理文件中,回显以确保调用和工作目录都可以,但它仍然不起作用。 奇怪。

如何避免更改堆栈大小并避免在C#中获得堆栈溢出

我一直想在网上和这个网站上找几个小时回答这个问题的答案,我不是那里。 我知道.NET会为应用程序分配1MB,并且最好通过重新编码而不是强制堆栈大小来避免堆栈溢出。 我正在开发一个“最短路径”的应用程序,可以运行大约3000个节点,此时它会溢出。 这是导致问题的方法: public void findShortestPath(int current, int end, int currentCost) { if (!weight.ContainsKey(current)) { weight.Add(current, currentCost); } Node currentNode = graph[current]; var sortedEdges = (from entry in currentNode.edges orderby entry.Value ascending select entry); foreach (KeyValuePair nextNode in sortedEdges) { if (!visited.ContainsKey(nextNode.Key) || !visited[nextNode.Key]) { int nextNodeCost = currentCost + nextNode.Value; if (!weight.ContainsKey(nextNode.Key)) { […]

C# – 属性导致StackOverflow

public class ModelInfo { public int AssignedCount { get; set; } public int UnassignedCount { get; set; } public int TotalCount { get { return UnassignedCount + TotalCount; } } } * 编辑: *我意识到当我把这个代码放在SO中时,TotalCount属性正在添加UnassignedCount + TotalCount(我的意思是将其他两个计数加在一起)。 有人可以提供一个足够的解释为什么SO错误发生? 我的意思是,低级别的东西。 Stackoverflowing!