2013-03-23 22 views
7

İlk olarak, Making a CLR/.NET Language Debuggable okudum, ancak bunu uygulamakta hala sorun yaşıyorum.DLR - Neden stacktrace'de hata ayıklama bilgisi gösterilmiyor?

Bir Linq İfade üreterek çalışan bir oyuncak dili yazdım ve LambdaExpression # CompileToMethod öğesini çağırarak. Bu ifadelerin çoğu ayıklama bilgileri şöyle iliştirilmesi:

olay tümüyle gibi comipled edilir
public class DebugInfo { 
    /* arbitrary value from http://www.famkruithof.net/uuid/uuidgen */ 
    public static Guid SmithGuid = new Guid("83c65910-8376-11e2-9e96-0800200c9a66"); 

    public readonly SymbolDocumentInfo SymbolDocumentInfo; 
    public readonly DebugInfoGenerator DebugPdbGenerator; 

    public DebugInfo(String name) { 
     SymbolDocumentInfo = Expression.SymbolDocument(name, SmithGuid); 
     DebugPdbGenerator = DebugInfoGenerator.CreatePdbGenerator(); 
    } 
} 

(sen INITs ilgili bölümü göz ardı edebilirsiniz):

//SmithExpression#InsertDebugInfo 
Expression InsertDebugInfo(Expression expression, DebugInfo debugInfo) { 
    var column = 1; 
    var debugExpr = Expression.DebugInfo(debugInfo.SymbolDocumentInfo 
       ,Info.LineNumber, column, Info.LineNumber, column + 1); 
    return Expression.Block(debugExpr, expression); 
} 

A Debuginfo şöyle

public static Action CompileSmithExpression(SmithExpression sexpression 
      ,DebugInfo debugInfo, Parameter moduleParameter, Expando module) { 
    AssemblyName assemblyName = 
     new AssemblyName(
      "RuntimeHelpers.CompileToSmithExpression helper assembly" 
     ); 
    AssemblyBuilder assemblyBuilder = 
     AppDomain.CurrentDomain.DefineDynamicAssembly(
      assemblyName, AssemblyBuilderAccess.RunAndSave 
     ); 

    ModuleBuilder moduleBuilder = assemblyBuilder 
      .DefineDynamicModule(assemblyName.Name, "onlyModule.dll"); 

    var debugAttributes = 
     DebuggableAttribute.DebuggingModes.Default | 
     DebuggableAttribute.DebuggingModes.DisableOptimizations; 

    ConstructorInfo constructor = 
     typeof(DebuggableAttribute) 
     .GetConstructor(new Type[] { 
      typeof(DebuggableAttribute.DebuggingModes) 
      } 
     ); 
    var cab = new CustomAttributeBuilder(constructor, new object[] { debugAttributes }); 
    assemblyBuilder.SetCustomAttribute(cab); 
    moduleBuilder.SetCustomAttribute(cab); 

    TypeBuilder typeBuilder = 
     moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public); 

    //inits generates expressions that set 'constant' fields to their values. 
    //the call also adds the 'constant' fields to the typeBuilder. 
    //Must call ToArray() to make it run. 
    var inits = FieldInits(sexpression, typeBuilder).ToArray(); 
    var ex = sexpression.ToExpression(debugInfo); 
    var fullDlrExpression = Expression.Block(inits.Append(ex)); 

    var parameters = new ParameterExpression[] { moduleParameter.DlrParameter }; 
    var lambda = Expression.Lambda(fullDlrExpression, parameters); 

    /* Method will take the module as a parameter. */ 
    MethodBuilder meth = typeBuilder.DefineMethod(
     "MyMethod", 
     MethodAttributes.Public | MethodAttributes.Static, 
     typeof(void), 
     new Type[] { typeof(Expando) }); 

    lambda.CompileToMethod(meth, debugInfo.DebugPdbGenerator); 

    Type madeType = typeBuilder.CreateType(); 

    return() => madeType.GetMethod("MyMethod").Invoke(null, new Object[] { module }); 
} 

Kod çalıştırma, istediğim istisnayı verir, ancak ifadenin sahip olduğu hata ayıklama bilgilerini içermez. "< error_immediate, 1 >" gibi bir şey söylemeyi isterim.

Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.MissingMemberException: Can't invoke member error of [] [] 
at (wrapper dynamic-method) object.CallSite.Target (System.Runtime.CompilerServices.Closure,System.Runtime.CompilerServices.CallSite,Smith.Expando) <IL 0x0004f, 0x00127> 
at System.Dynamic.UpdateDelegates.UpdateAndExecute1<Smith.Expando, object> (System.Runtime.CompilerServices.CallSite,Smith.Expando) <0x0040b> 
at MyDynamicType.MyMethod (Smith.Expando) <IL 0x002bc, 0x00aaa> 
at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) <IL 0x00016, 0x00067> 
etc... 

En iyi tahminle ayıklama bilgileri aslında orada, ama bunu göstermek için stacktrace almak için daha fazla iş yapmak gerekecek olmasıdır. Herhangi bir fikir?

+0

Kesinlikle daha fazla iş, basit bir şey. http://dlr.codeplex.com/discussions/80850 –

+0

"IronRuby, derleme sırasında bir DebugInfoGenerator sağlayarak IL ofsetinin satır sayısına eşlenmesini sağlar." Bu tam olarak yapmak istediğim şeydir ve her ifade zaten bir DebugInfoExpression ile etiketlenmiştir. Bir IL konumdan en yakın DebugInfoExpression satır numarasına gitmek için bir yol varsa, ben bir stacktrace yapabilirim. – user1727289

cevap

0

İstisnaınız yuvalanmış bir istisnadır. Yığın izini yazdırmak için InnerException'a bir göz atın.

catch (Exception ex) 
{ 
    while (ex != null) { 
     Debug.Print(ex.ToString()); 
     ex = ex.InnerException(); 
    } 
} 
İlgili konular