2014-05-14 9 views

답변

0

정말 기쁩니다. 이 문제는 최근에 저에게 일어났습니다. 나는 TraceSwitch es, TraceSource s와 TraceListener의 사슬에서 무언가를 의심했다. 그러나 추적 및 오류 메시지가 없기 때문에 더 많은 정보가 필요했습니다. BCL의 작성자는 모든 진단 정보를 가비지 컬렉터가 느낄 때 사라지는 개인 목록에 유용하게 넣습니다. 아직도, 정보는 충분히 좋았고 반사를 통해 접근 가능했습니다. 그것은 내가 여러개의 TraceSource을 가지고 있음이 밝혀졌지만 문제의 하나는 스위치가 Off가 아닌 다른 것으로 설정되지 않았다. (또 다른 나쁜 신호는 청취자가 없거나 "기본"청취자 만됩니다.)

DumpText라는 레이블이있는 페이지의 Page_Load 이벤트입니다. 나는이 코드가 Console이나 WinForms에 적용될 수 있다고 확신한다.

protected void Page_Load(object sender, EventArgs e) 
{ 
    TraceSource ts = new TraceSource("foo"); 
    List<WeakReference> list = (List<WeakReference>)GetInstanceField(typeof(TraceSource), ts, "tracesources"); 
    Dictionary<string, TraceSource> sources = new Dictionary<string, TraceSource>(); 
    foreach (var weakReference in list) 
    { 
     if (!weakReference.IsAlive) continue; 
     TraceSource source = (weakReference.Target as TraceSource); 
     if (source == null || source.Name == "foo") continue; 
     if (sources.ContainsKey(source.Name)) continue; 
     sources.Add(source.Name, source); 
    } 
    StringBuilder sb = new StringBuilder(); 

    foreach (KeyValuePair<string,TraceSource> kvp in sources.OrderBy((x) => x.Key)) 
    { 
     TraceSource source = kvp.Value; 
     if (source == null) 
     { 
      continue; 
     } 
     sb.Append("<h3>"); 
     sb.Append(source.Name); 
     sb.Append(" - "); 
     sb.Append(source.Switch.Level); 
     sb.Append("</h3>"); 

     if (source.Switch.Level == SourceLevels.Off) 
     { 
      continue; 
     } 
     foreach (TraceListener l in source.Listeners) 
     { 
      sb.Append(l.Name); 
      sb.Append(" - "); 
      sb.Append(l.GetType().ToString()); 
      sb.Append("<br/>"); 

      foreach (string att in l.Attributes.Values) 
      { 
       sb.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"); 
       sb.Append(att); 
       sb.Append(","); 
      } 
     } 
     sb.Append("<br/>"); 
    } 
    this.DumpText.Text = sb.ToString(); 
} 

internal static object GetInstanceField(Type type, object instance, string fieldName) 
    { 
     BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic 
      | BindingFlags.Static; 
     FieldInfo field = type.GetField(fieldName, bindFlags); 
     return field.GetValue(instance); 
    }