我的c#服务有一个内部.net执行错误,指向递归问题(例如堆栈溢出)。问题是服务非常大,所以我很难找到实际发生递归的位置。
拥有大规模正则表达式mojo的人是否可以使用搜索字符串来查找我需要的内容?
答案 0 :(得分:6)
在一般情况下,这是一个无法回答的问题。除了最简单的例子(例如直接调用自身的函数)之外,没有办法分析程序并确定是否发生递归。您只需要开始调试调试器或其他运行时工具。
的示例答案 1 :(得分:5)
在某些情况下不容易找到递归:
method1() {
method2()
}
method2() {
method1()
}
所以一个正则表达式可能无法帮助你找到它,除非它是一个微不足道的案例。
答案 2 :(得分:4)
如何使用RedGate's Ants profiler或dotTrace等分析工具?
他们都提供免费试用。只需运行探查器运行代码,它就会快速显示您的时间/内存花费在哪里。
我敢打赌,你的问题递归函数会有很长的作用。
此外,您使用的是什么错误日志框架?如果答案是否定的,请考虑采用一个。 This Question deals with the options.有了一个好的系统,你应该能够获得堆栈跟踪,如果你幸运的话,它可以为你提供关于异常发生位置的线索。
答案 3 :(得分:4)
答案 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