C# Mono-Debug.Assert不起作用
我这里有一个程序:C# Mono-Debug.Assert不起作用,c#,mono,C#,Mono,我这里有一个程序: namespace TodoPlus { using System.Diagnostics; public class LameProg { public LameProg() {} public static void Main(string[] args) { int a = 2; int b = 3; Debug.Assert(a == b, "Bleh")
namespace TodoPlus {
using System.Diagnostics;
public class LameProg {
public LameProg() {}
public static void Main(string[] args) {
int a = 2;
int b = 3;
Debug.Assert(a == b, "Bleh");
System.Console.WriteLine("Haha it didn't work");
}
}
}
不知何故,Debug.Assert不起作用
我使用的是Mono 2.10.5,这是我用来编译和执行的:
$dmcs LameProg.cs
$mono./LameProg.exe
我怎样才能做到这一点?我希望它与C中的assert宏具有相同的效果,也就是说它应该彻底崩溃程序。是否可以通过Debug.Assert实现这一点,或者是否有其他函数可以实现这一点
谢谢
$dmcs-d:DEBUG LameProg.cs
$export MONO\u TRACE\u LISTENER=Console.Error
$mono LameProg.exe
调用通常在调试版本中使用,并从发布版本中删除。如果要确保某个条件成立,并且此检查应该出现在发布版本中,请使用
If
语句和throw
异常:
publicstaticvoidmain(字符串[]args)
{
INTA=2;
int b=3;
如果(a!=b)
{
抛出新异常(“Bleh”);
}
System.Console.WriteLine(“哈哈,它不工作”);
}
我认为您需要两件事:编译器的DEBUG属性和运行时的“跟踪侦听器”。我要和它一起工作
% export MONO_TRACE_LISTENER=Console.Error
% mcs -define:DEBUG -debug Prog.cs
% mono Prog.exe
正如我预期的那样,断言失败时仍然不会立即退出,但至少它会打印一些东西。还有另一个技巧:您可以通过TraceListener添加“立即退出”行为,因为Debug.Assert失败会触发对跟踪侦听器中Fail()的调用 您仍然需要定义:调试(和跟踪?)。我个人希望Assert()调用(在调试构建中)停止我的程序,转储调试信息并退出。我就是这样做的: 在我的代码中,我安装了一个自定义跟踪侦听器来转储堆栈,并添加了对Exit()的调用。还有维奥拉!您对Assert.Fail()有一个行业标准响应。例如,您还可以在此处打印时间戳等
public class DumpStackTraceListener : TraceListener
{
public override void Write( string message )
{
Console.Write( message );
}
public override void WriteLine(string message)
{
Console.WriteLine( message );
}
public override void Fail(string message)
{
Fail( message, String.Empty );
}
public override void Fail(string message1, string message2)
{
if (null == message2)
message2 = String.Empty;
Console.WriteLine( "{0}: {1}", message1, message2 );
Console.WriteLine( "Stack Trace:" );
StackTrace trace = new StackTrace( true );
foreach (StackFrame frame in trace.GetFrames())
{
MethodBase frameClass = frame.GetMethod();
Console.WriteLine( " {2}.{3} {0}:{1}",
frame.GetFileName(),
frame.GetFileLineNumber(),
frameClass.DeclaringType,
frameClass.Name );
}
#if DEBUG
Console.WriteLine( "Exiting because Fail" );
Environment.Exit( 1 );
#endif
}
}
结合呼叫:
#if DEBUG
Debug.Listeners.Add( new DumpStackTraceListener() );
#endif
另外一个不一定更好的选项是Trace.Assert(…)嘿,很抱歉回复得太晚,但我尝试了dmcs-d:DEBUG-LameProg.cs mono./LameProg.exe,但它不起作用。Trace.Asserte的情况也一样,这里甚至可以找到更好的答案,最初取自这里,并且
export MONO\u Trace\u LISTENER=Console.Out
可以用于在stdout而不是stderr上转储断言。对我来说,执行不会在断言时停止。为什么heck没有打印调试。断言stderr/stdout不是mono的默认值?天哪,这看起来像一个恶作剧-断言最后在mono中所做的唯一事情就是打印。很可怕,断言应该以致命的方式关闭程序,但不只是打印stacktrace。我不太喜欢IDE,但谢谢你的建议。理想情况下,应该有一种不使用IDE就能实现这些功能的方法。这是开源的最大优势,您可以按自己喜欢的方式进行更改。但必须先进行rtfm。可能的重复不确定您被否决的原因。这是我迄今为止看到的最有用的答案。没什么大不了的。人们有权发表自己的意见,即使他们的意见是我错了!:)