抛出异常时,其文本包含堆栈跟踪.我可以以某种方式获得堆栈跟踪文本(包括文件和行)没有例外吗?
public void f()
{
//blah
string stacktrace = ???;
//blah
}
Run Code Online (Sandbox Code Playgroud) 可以使用System.Diagnostics.StackTrace获取堆栈跟踪,但必须暂停线程.暂停和恢复功能已经过时,所以我希望存在更好的方法.
.net debugging multithreading stack-trace visual-studio-debugging
我有一个使用返回值处理错误的组件,而不是标准的异常处理.除了错误代码之外,它还返回错误发生位置的堆栈跟踪.我用来调用组件的包装器将解释返回代码并抛出异常.
我想让包装器抛出一个异常,其中包含从组件中捕获的堆栈跟踪信息.我希望它看起来好像异常是从错误的原始站点抛出的,即使它被抛到其他地方.更具体地说,id类似于visual studio测试运行器显示的堆栈跟踪,以反映正确的位置
有没有办法做到这一点?如果我可以避免访问私人成员的低级反射技巧,那也很好,但我会采取我能得到的.
编辑1: 我不关心如何捕获堆栈跟踪,我关心的是将已经捕获的堆栈跟踪附加到异常
编辑2:
我尝试重写StackTrace属性,但是visual studio正在从其他地方提取堆栈跟踪数据,并且似乎完全忽略了被覆盖的属性
CustomException GenerateExcpetion()
{
return new CustomException();
}
void ThrowException(Exception ex)
{
Trace.WriteLine("Displaying Exception");
Trace.WriteLine(ex.ToString());
var edi = ExceptionDispatchInfo.Capture(ex);
edi.Throw();
}
[TestMethod]
public void Test006()
{
var ex = GenerateExcpetion();
ThrowException(ex);
}
public class CustomException : Exception
{
string _stackTrace;
public CustomException()
{
_stackTrace = Environment.StackTrace;
}
public override string StackTrace
{
get
{
return base.StackTrace;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Excpetion.ToString()方法从私有属性中提取堆栈跟踪数据,因此来自覆盖的堆栈跟踪不会显示.
CustomException:抛出了类型'CustomException'的异常.
ExceptionDispatchInfo也从私有属性中查找堆栈跟踪数据,因此它无法找到任何该数据,并且当您抛出此自定义异常时,新的堆栈跟踪将附加到该异常,其位置为抛出.如果直接使用throw,则私有堆栈信息将设置为发生抛出的位置.
当Exception发生时,您可以打印出StackTrace并查看它.
如果你想在没有异常的情况下获得StackTrace怎么办?
有没有办法做到这一点?
是否有可能在Windows应用商店中获取当前的调用堆栈,而不会抛出异常?
我找到了这个答案,但它不适用于Windows应用商店.
为什么我需要这个
我需要得到调用堆栈,因为我有一个DirectX纹理内存泄漏.
我想在分配它时将调用堆栈附加到我的纹理.在一些程序使用之后,我打印了尚未解除分配的所有纹理的callstack.
应该很容易看到我忘记取消分配纹理的位置.
我希望能够将c#中的堆栈跟踪打印到txt文件中,如下所述.请注意以下内容:
FileHandler类内部代码并不重要.我想知道如何获取此处捕获的异常的堆栈跟踪.
try
{
//some code
}
// I just inherit from exception class (the message member, nothing big here)
catch (CustomException ex)
{
//I want to write the stacktrace here instead of the ex.Message
FileHandler.Write("DeveloperErrors.txt", "Stack Trace" + ex.Message, System.IO.FileMode.Append);
}
Run Code Online (Sandbox Code Playgroud)