Tag: callstack

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#(或一般的.NET)中,您是否可以屏蔽通过属性抛出exception的调用堆栈级别?

标题可能有点令人困惑所以我会解释。 说你有这个电话链…… public DoWork(index) >> private DoWorkHelper(index) >> private CheckIndex(index) 现在,如果您调用DoWork ,它会将调用遍历到CheckIndex ,将每个更深的调用添加到调用堆栈。 现在,如果某人使用错误的index值调用DoWork ,它会在CheckIndex一直抛出exception,而且当前,这就是调试器中断的地方。 然后你必须走回调用堆栈才能看到真正的犯罪者是有人将坏数据传递给DoWork 。 现在回到VB6时代,你可以简单地用一个属性装饰DoWorkHelper和CheckIndex来说’如果我内部抛出任何exception,请不要突出显示我,而是突出我的调用者,因为他们是那些通过我糟糕废话的人!’ 因此,在这种情况下,代码将在DoWork突破, DoWorkHeper突出显示对DoWorkHeper的调用。 还有一个设置可以禁用它,所以为了更深层次的调试目的,它仍然可以抛出CheckIndex ,它实际发生的级别,但有一半的时间,那里的故障告诉你什么都没有,因为你不知道你是怎么到达那里的走回调用堆栈。 可以认为这是一种装饰代码的方法,可以说明当你遇到exception时,自动遍历调用堆栈到坏值实际告诉你有用的地方。 请注意,这类似于“Break On All Exceptions”,除非您通过装饰处理此问题。 另外,您没有设置中断特定类型的exception(例如所有空引用exception等),而是特定方法! (或者更准确地说,是一种称为装饰方法的那种。) 那么C#或.NET一般都有这个吗? 更新 虽然我向Dark Falcon提供了答案,因为他指导我在那里,我已经添加了一个更详细的解释,说明所有属性的含义,以及在什么情况下。 请在下面查看。

Visual Studio 2010的“线程”窗口中的和详细信息

我一直在尝试使用一个应用程序调试与线程相关的一些问题。 当我附加到应用程序时,我看到一个像这样的窗口: 这个名为“[Thread Destroyed]”的post是什么? 应用程序代码肯定不会写这个名字。 什么意味着Thread的调用堆栈不可用。 “Acquisition Engine”线程在应用程序内部创建,并在循环内运行直到停止。 如果线程被停止,它将退出循环并终止它的生命,因此它应该在线程列表中。 如果它存在,因为它还没有退出循环,那么,又是什么意味着callstack不可用? 在此先感谢您的帮助,这个似乎并不容易。

调用堆栈中的“”

我正在调试一个程序(VS2008),我正在逐步调试代码。 我遇到了一个调用委托函数的行,我试图进入它。 但是,不是像我预期的那样进入方法,而是绕过了这个方法,调试器改为踩到我认为是委托调用的函数。 在调用堆栈中,我期望委托方法的行用文本[Lightweight Function]显示为灰色。 “轻量级function”部分是什么意思? 有没有办法进入这个function?

对于C#日志记录,如何以最小的开销获取调用堆栈深度?

我已经为Log4net创建了一个包装器(我可能会支持NLog;我还没有决定),并且我缩进了记录的消息结果以给出调用结构的概念。 例如: 2011-04-03 00:20:30,271 [CT] DEBUG – Merlinia.ProcessManager.CentralThread.ProcessAdminCommand – ProcStart – User Info Repository 2011-04-03 00:20:30,271 [CT] DEBUG – Merlinia.ProcessManager.CentralThread.StartOneProcess – User Info Repository 2011-04-03 00:20:30,411 [CT] DEBUG – Merlinia.ProcessManager.CentralThread.SetProcessStatus – Process = User Info Repository, status = ProcStarting 2011-04-03 00:20:30,411 [CT] DEBUG – Merlinia.ProcessManager.CentralThread.SendProcessStatusInfo 2011-04-03 00:20:30,411 [CT] DEBUG – Merlinia.CommonClasses.MhlAdminLayer.SendToAllAdministrators – ProcessTable 2011-04-03 00:20:30,411 […]

c#setter中的堆栈溢出exception

这很容易解释:这很有效 using System; using ConstraintSet = System.Collections.Generic.Dictionary; namespace ConsoleApplication2 { class test { public ConstraintSet a { get; set; } public test() { a = new ConstraintSet(); } static void Main(string[] args) { test abc = new test(); Console.WriteLine(“done”); } } } 这不 using System; using ConstraintSet = System.Collections.Generic.Dictionary; namespace ConsoleApplication2 { class test { […]

获取运行时类型的堆栈帧

我想知道是否有可能在堆栈跟踪中获取运行时类型的方法调用程序。 请考虑以下示例: class Parent { public void Foo() { var stack = new StackTrace(); foreach (var frame in stack.GetFrames()) { var methodInfo = frame.GetMethod(); Console.WriteLine(“{0} (ReflectedType: {1})”, methodInfo.ToString(), methodInfo.DeclaringType); } } } class Child : Parent { } 如果我创建一个Child实例并调用Foo var child = new Child(); child.Foo(); Foo将打印:Void Foo()(ReflectedType:Parent) 有没有办法在堆栈跟踪中获取方法调用者的实际运行时类型(在本例中为Child)?

异步递归。 我的记忆在哪里?

这更多地是出于好奇而不是任何现实世界的问题。 请考虑以下代码: void Main() { FAsync().Wait(); } async Task FAsync() { await Task.Yield(); await FAsync(); } 在同步世界中,这最终会导致堆栈溢出。 在异步世界中,这只会消耗大量内存(我认为这与我可能松散地称之为“异步堆栈”的内容有关?) 这些数据到底是什么,以及如何保存?

你如何找到呼叫者function?

作为“如何找到调用当前方法的方法?”的精确副本关闭。 这可能与c#有关吗? void main() { Hello(); } void Hello() { // how do you find out the caller is function ‘main’? }

调用堆栈没有说“你来自哪里”,而是“你下一步去哪里”?

在上一个问题( 获取对象调用层次结构 )中,我得到了这个有趣的答案 : 调用堆栈不是告诉你你来自哪里。 它是告诉你下一步的去向。 据我所知,在到达函数调用时,程序通常会执行以下操作: 在调用代码时: 存储返回地址(在调用堆栈上) 保存寄存器的状态(在调用堆栈上) 写入将传递给函数的参数(在调用堆栈或寄存器中) 跳转到目标函数 在被叫目标代码中: 检索存储的变量(如果需要) 返回过程 :撤消我们调用函数时所做的操作,即展开/弹出调用堆栈: 从调用堆栈中删除局部变量 从调用堆栈中删除函数变量 恢复寄存器状态(我们之前存储的状态) 跳转到返回地址(我们之前存储的地址) 题: 如何将其视为“告诉您下一步的去向”而不是“告诉您从哪里来” ? 在C#的JIT或C#的运行时环境中是否存在使得调用堆栈以不同方式工作的东西? 感谢有关调用堆栈描述的文档的任何指示 – 有大量关于传统调用堆栈如何工作的文档。