【问题标题】:Unhandled exception, unable to debug未处理的异常,无法调试
【发布时间】:2012-03-07 04:45:54
【问题描述】:

我正在尝试调试检查 MIPS 语法的 c# 应用程序。但它不允许调试它。无论我在哪里输入断点,它都会被忽略,包括 Main() 函数的第一行。它也给我这个错误。 如果我不调用 HasValidParams(),'add a b c' 工作正常 'add a b' 在同样的情况下抛出异常 调用 HasValidParams() 时都不起作用

程序.cs

private static void Main(string[] args)
        {
            var validator = new MipsValidator();
            Console.Write("Please enter a MIPS statement: ");
            string input = Console.ReadLine();
            List<string> arguments = input.Split(new char[0]).ToList();
            Response status = validator.IsSyntaxValid(arguments);
            //Check syntax
            if (status.Success.Equals(true))
            {
                Response stat = validator.HasValidParams(arguments);
                //Check parameters
                if (stat.Success.Equals(true))
                {
                Console.WriteLine(string.Format("'{0}' is a valid mips instruction ", input));
                }
                else
                {
                    foreach (var reason in stat.Reasons)
                    {
                        Console.WriteLine(reason);
                    }
                }
            }
            else
            {
                foreach (string reason in status.Reasons)
                {
                    Console.WriteLine(reason);
                }
            }
        }

mips-validator.cs

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace mips_validator.utils
{
    public class MipsValidator : IMipsValidator
    {
        #region Implementation of IMipsValidator

        public Response IsSyntaxValid(List<string> args)
        {
            var response = new Response {Success = true};
            var op = (Operator) Enum.Parse(typeof (Operator), args[0]);
            switch (op)
            {
                case Operator.addi:
                case Operator.add:
                case Operator.beq:
                    if (args.Count != 4)
                    {
                        response.Reasons.Add(string.Format("4 operands required for {0}, {1} parameters provided.",
                                                           op, args.Count));
                        response.Success = false;
                    }
                    break;
                case Operator.j:
                    if (args.Count != 2)
                    {
                        response.Reasons.Add(string.Format("1 operands required for {1}, {0} parameters provided.",
                                                           args.Count, op));
                        response.Success = false;
                    }
                    break;
                default:
                    response.Reasons.Add(string.Format("{0} is an unknown mips operation", op));
                    response.Success = false;
                    break;
            }
            return response;
        }

        public Response HasValidParams(List<string> parameters)
        {
            string op1, op2, op3;
            var temporary = new Regex(@"/\$t\d+/");
            var store = new Regex(@"/\$s\d+/");
            var zero = new Regex(@"/\$zero/");
            var osReserved = new Regex(@"/\$k0|1/");
            var memory = new Regex(@"");
            var constant = new Regex(@"/-?\d*/");
            var label = new Regex(@"/.*\:/");
            Operator operation;
            var response = new Response {Success = true};
            string opString = parameters[0];
            Enum.TryParse(opString.Replace("$", string.Empty), true, out operation);
            switch (operation)
            {
                case Operator.add:
                    {
                        op1 = parameters[1];
                        op2 = parameters[2];
                        if (!temporary.IsMatch(op1) && !store.IsMatch(op1) && !zero.IsMatch(op1))
                        {
                            response.Reasons.Add(string.Format("{0}: error register expected", op1));
                            response.Success = false;
                        }
                        if (!temporary.IsMatch(op2) && !store.IsMatch(op2) && !zero.IsMatch(op2))
                        {
                            response.Reasons.Add(string.Format("{0}: error register expected", op2));
                            response.Success = false;
                        }
                    }
                    break;
                case Operator.addi:
                    {
                        op1 = parameters[1];
                        op2 = parameters[2];
                        if (!temporary.IsMatch(op1) && !store.IsMatch(op1) && !zero.IsMatch(op1))
                        {
                            response.Reasons.Add(string.Format("{0}: error register expected", op1));
                            response.Success = false;
                        }
                        if (!constant.IsMatch(op2) && !zero.IsMatch(op2))
                        {
                            response.Reasons.Add(string.Format("{0}: error constant expected", op2));
                            response.Success = false;
                        }
                    }
                    break;
                case Operator.beq:
                    {
                        op1 = parameters[1];
                        op2 = parameters[2];
                        op3 = parameters[3];
                        if (!temporary.IsMatch(op1) && !store.IsMatch(op1) && !zero.IsMatch(op1))
                        {
                            response.Reasons.Add(string.Format("{0}:  error register expected", op1));
                            response.Success = false;
                        }
                        if (!temporary.IsMatch(op2) && !store.IsMatch(op2) && !zero.IsMatch(op2))
                        {
                            response.Reasons.Add(string.Format("{0}: error register expected", op2));
                            response.Success = false;
                        }
                        if (!label.IsMatch(op3) && !constant.IsMatch(op3))
                        {
                            response.Reasons.Add(string.Format("{0}: error label or constant expected", op3));
                            response.Success = false;
                        }
                    }
                    break;
            }

            return response;
        }

        #endregion
    }
}

解决方案----- Response.cs(旧)

public class Response
{
    public List<string> Reasons;
    public bool Success = true;

}

Response.cs(当前)

 public class Response
    {
        public Response()
        {
            Reasons = new List<string>();
            Success = true;
        }
        public List<string> Reasons;
        public bool Success = true;

    }

【问题讨论】:

  • 不确定您的调试问题,但至于异常,当您创建 Response 对象时,原因初始化了吗?
  • @Mike 不,不是感谢您指出这一点。将其添加到构造函数中。

标签: c# .net console-application visual-studio-debugging unhandled-exception


【解决方案1】:

我不知道您是否正在寻找能够调试项目的方法,或者您是否希望被告知代码中的潜在问题。

对于后者:

确保Response.Reasons 由Response 的构造函数(或字段初始化程序)初始化。

【讨论】:

    【解决方案2】:

    您没有显示 Response 类,因此请确保实际将 Reasons 设置为您可以添加到的集合,而不是保留默认值 null。

    编辑:@nodakai 指出以下可能导致崩溃的原因根本不是一个;事实证明,空字符数组是在空格上拆分的特殊情况。

    *你通过做来计算参数 列表参数 = input.Split(new char[0]).ToList(); ...据我所知,除了将原始字符串放在列表中之外,它绝对 什么都没有。您可能希望在 new char[] {' '} 上拆分,而不是在空格上拆分。*

    【讨论】:

    【解决方案3】:

    检查您的断点是否如下所示:

    如果是这样,则您的源代码与实际编译程序集的代码不同。确保您的项目已正确构建(右键单击解决方案并选择“重建”)并检查您当前的配置:

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 2013-06-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2019-03-22
      • 2019-08-24
      相关资源
      最近更新 更多