Tag: stack trace

获取对象调用层次结构

可以说我有3节课: class A { void do_A() { //Check object call hierarchy } } class B { void do_B() { A a; a.do_A(); } } class C { void do_C() { B b; b.do_A(); } } 然后我打电话给: C c; c.do_C(); 如何从A的do_A()中获取对象调用层次结构? 我的意思是我想在a.do_A()中获取对象的引用(可以通过this方便地实现),对象b的引用调用a.do_A() ,以及对象c的引用,称为b.do_B( ) 。 我认为这应该是可能的,因为我可以通过调用堆栈获得调用层次结构,所以我确信我应该能够获得有关调用这些方法的对象的更多信息。

如何在非托管c ++ dll中查找调用方程序集名称

我有一个非托管的c ++ DLL 。 我从c#(.net 3.5)调用这个非托管dll的外部方法 我正在寻找一种方法来找到女巫c#assembly正在调用我的非托管c ++ dll (进入我的c ++ dll)(至少,汇编名称) 当然, 我不想将任何其他参数传递给方法 。 提前致谢

使用C#属性来跟踪函数调用,变量和返回值?

在Python中,我可以使用装饰器来跟踪函数调用,它的变量和返回值。 这是非常容易使用。 我只是想知道C#可以做同样的事情吗? 我发现在线有一个CallTracing属性的示例代码。 但是,它没有显示我预期的结果。 C#属性是否与python的装饰器具有相似的概念? 谢谢你和最诚挚的问候! [AttributeUsage(AttributeTargets.Method | AttributeTargets.ReturnValue | AttributeTargets.Property, AllowMultiple = false)] public class CallTracingAttribute : Attribute { public CallTracingAttribute() { try { StackTrace stackTrace = new StackTrace(); StackFrame stackFrame = stackTrace.GetFrame(1); Trace.TraceInformation(“{0}->{1} {2}:{3}”, stackFrame.GetMethod().ReflectedType.Name, stackFrame.GetMethod().Name, stackFrame.GetFileName(), stackFrame.GetFileLineNumber()); Debug.WriteLine(string.Format(“{0}->{1} {2}:{3}”, stackFrame.GetMethod().ReflectedType.Name, stackFrame.GetMethod().Name, stackFrame.GetFileName(), stackFrame.GetFileLineNumber())); } catch { } } } class Program […]

有什么方法可以避免C#中的Property内联优化?

所以我有一个旨在实现INotifyPropertyChanged的PropertyBag类。 为了使这段代码尽可能干净地工作并避免用户错误,我使用堆栈来获取属性名称。 请参阅,如果属性名称与实际属性完全不匹配,那么您将失败并且我正在尝试保护它。 所以,这是该类的示例用法: public class MyData : PropertyBag { public MyData() { Foo = -1; } public int Foo { get { return GetProperty(); } set { SetProperty(value); } } } 基本PropertyBag的重要代码在这里: public abstract class PropertyBag : INotifyPropertyChanged { protected T GetProperty() { string propertyName = PropertyName((new StackTrace()).GetFrame(1)); if (propertyName == null) throw new […]

抛出exception时从stacktrace和frame获取文件名

我试图在抛出exception时获取文件名和源代码编号。 但我一无所获。 class Program { static void Main(string[] args) { try { throw new InvalidOperationException(); } catch (InvalidOperationException exception) { var stackTrace = new StackTrace(exception); var currentFrame = stackTrace.GetFrame(0); var fileName = currentFrame.GetFileName(); var sourceLineNumber = currentFrame.GetFileLineNumber(); Console.WriteLine(“File Name: ” + fileName); Console.WriteLine(“Source line number: ” + sourceLineNumber); Console.ReadKey(); } } } 只有一个框架可用。 所以我在GetFrame(index)使用索引0。

获取运行时类型的堆栈帧

我想知道是否有可能在堆栈跟踪中获取运行时类型的方法调用程序。 请考虑以下示例: class Parent { public void Foo() { var stack = new StackTrace(); foreach (var frame in stack.GetFrames()) { var methodInfo = frame.GetMethod(); Console.WriteLine(“{0} (ReflectedType: {1})”, methodInfo.ToString(), methodInfo.DeclaringType); } } } class Child : Parent { } 如果我创建一个Child实例并调用Foo var child = new Child(); child.Foo(); Foo将打印:Void Foo()(ReflectedType:Parent) 有没有办法在堆栈跟踪中获取方法调用者的实际运行时类型(在本例中为Child)?

即使pdb存在,IIS也不会在堆栈跟踪中给出行号

Web配置有debug = true,项目是调试版本,pdb文件存在于bin目录中,但是当抛出exception时,我的堆栈跟踪中没有得到行号。 适用于本地IIS / Cassini,但不适用于我们的测试IIS服务器。 是否有一些明显的设置,我可能会失踪?

不要在堆栈跟踪中显示构建机器的文件路径

我目前正在开发一个C#应用程序,它已经拥有了自己的日志记录。 抛出exception时,exception将保存到列表中,用户可以通过列表视图查看该列表。 当用户在列表视图中单击exception时,exception的堆栈跟踪将显示在文本框中。 但即使我在远程计算机上执行程序,堆栈跟踪也会显示从编译应用程序的计算机到原始源文件的文件路径。 例如: at C:\Folder1\Folder2\Class1.cs:81 at C:\Folder1\Folder2\Class2.cs:65 at C:\Folder1\Folder1\Class3.cs:21 只显示没有文件夹的源文件会很好… 我该如何改变这种行为? 有原生解决方案吗? 或者我只需要做一些字符串操作?

获得Stacktrace

当Exception发生时,您可以打印出StackTrace并查看它。 如果你想在没有exception的情况下获得StackTrace怎么办? 有没有办法做到这一点?

没有堆栈跟踪的exception – 如何?

我们有一个服务,它将在应用程序域级别(通过Log4net)记录未处理的exception。 我们记录了: 2014-01-28 16:49:19,636错误[49] FeedWrapperService – 未处理的System.NullReferenceException:未将对象引用设置为对象的实例。 此exception没有堆栈跟踪。 如果不对exception对象做一些疯狂的事情,那怎么可能呢? 我们的处理代码: AppDomain.CurrentDomain.UnhandledException += LogAnyExceptions; private void LogAnyExceptions(object sender, UnhandledExceptionEventArgs e) { log.Error(“unhandled”, (Exception)e.ExceptionObject); throw (Exception)e.ExceptionObject; } 在我看来,重新抛出这一点毫无意义,因为AppDomain无论如何都会随着进程而下降,但我认为它不会影响我们的情况。 Windows应用程序事件查看器还仅显示此null引用exception且没有跟踪。 我已经测试了exception处理程序日志记录,它成功记录了堆栈跟踪和任何内部exception。 如果它被我们的代码抛出,我们会看到堆栈跟踪。 如果它被第三方c#库抛出,那么,我们再次看到至少一个方法的堆栈跟踪(无论是否是重新抛出的exception)。 在这里,我们看到一个没有堆栈跟踪的托管exception。 我不知道这是怎么回事。 查看反编译的第三方库,它与非托管代码进行对话,引发此exception的事件可能在非托管域中,但是如果没有堆栈跟踪,这种情况怎么会导致托管的空引用exception呢? 这个问题的原因是间歇性的。 我们已经在生产中运行了几个月的代码,并且看过它曾经这样做过。 这非常怪异。 普遍的共识是,应该将负责此类问题的系统推送到子进程中,这样我们就可以安全自动地处理问题并重新启动,但知道发生了什么事情会很好。 编辑以包含以下评论信息: 我的exception不是标准的重新抛出,因为堆栈跟踪是空或空。 它没有重新投掷方法的名称。 进一步深入,Exception类可以从序列化信息构造,看起来序列化信息可能包含堆栈跟踪的空字符串,并且可能创建它而不会导致其他错误。 我想它可能来自那里,但我不知道它是如何起源的。