如何在您的应用程序中找到递归?

时间:2009-11-05 19:51:35

标签: c# regex recursion

我的c#服务有一个内部.net执行错误,指向递归问题(例如堆栈溢出)。问题是服务非常大,所以我很难找到实际发生递归的位置。

拥有大规模正则表达式mojo的人是否可以使用搜索字符串来查找我需要的内容?

8 个答案:

答案 0 :(得分:6)

在一般情况下,这是一个无法回答的问题。除了最简单的例子(例如直接调用自身的函数)之外,没有办法分析程序并确定是否发生递归。您只需要开始调试调试器或其他运行时工具。

这是halting problem

的示例

答案 1 :(得分:5)

在某些情况下不容易找到递归:

method1() {
  method2()
}

method2() {
  method1()
}

所以一个正则表达式可能无法帮助你找到它,除非它是一个微不足道的案例。

答案 2 :(得分:4)

如何使用RedGate's Ants profilerdotTrace等分析工具?

他们都提供免费试用。只需运行探查器运行代码,它就会快速显示您的时间/内存花费在哪里。

我敢打赌,你的问题递归函数会有很长的作用。

此外,您使用的是什么错误日志框架?如果答案是否定的,请考虑采用一个。 This Question deals with the options.有了一个好的系统,你应该能够获得堆栈跟踪,如果你幸运的话,它可以为你提供关于异常发生位置的线索。

答案 3 :(得分:4)

我同意regexp不会在这里削减它。

更直接的方法是获取转储文件并查看它以查看抛出异常的位置。

或者您可以查看像NDepend这样的静态分析工具来检查程序流程。

答案 4 :(得分:2)

附加到the service in the debugger并正确调试。您会发现这比尝试搜索任何合理大小的项目的代码要容易得多。

答案 5 :(得分:1)

最简单的方法是获取崩溃事物的堆栈跟踪。堆栈跟踪将如下所示:

Blah
Foo
Baz
Hello
...
Frob
Frob
Frob
Frob
[several hundred more Frobs]
Frob
Frob
...
Frob
Something -- crash!

“Frob”是递归函数。 : - )

答案 6 :(得分:1)

在 dotnet 5 中,您的应用程序会在发生递归的地方崩溃后在 stderr 输出中告诉您。

Stack overflow.
Repeat 32128 times:
--------------------------------
   at SoExceptional.Program.RecursiveDeath()
--------------------------------
   at SoExceptional.Program.Main(System.String[])

Process finished with exit code -1,073,741,571.

答案 7 :(得分:0)

我不鼓励你花钱购买商业工具,但你可以查看下面的手册,了解他们一般如何做,考虑哪些因素等。

http://www.klocwork.com/products/documentation/current/Finding_potential_stack_overflow_errors