C# 如何在Kernel32.dll库中使用RtlCaptureStackBackTrace()?

C# 如何在Kernel32.dll库中使用RtlCaptureStackBackTrace()?,c#,interop,dllimport,C#,Interop,Dllimport,我知道StackTrace类,但是对于我正在做的事情,由于所有的符号查找,这太慢了 我在Kernel32.dll中听说了RtlCaptureStackBackTrace函数,但我似乎无法让它正常工作。我不熟悉pinvoke,因为我很少用它做任何事情,我所做的事情在网上都有很好的报道,但这不是: 这是我的定义: [DllImport("kernel32.dll")] public static extern ushort RtlCaptureStackBackTrace(uint FramesTo

我知道StackTrace类,但是对于我正在做的事情,由于所有的符号查找,这太慢了

我在Kernel32.dll中听说了RtlCaptureStackBackTrace函数,但我似乎无法让它正常工作。我不熟悉pinvoke,因为我很少用它做任何事情,我所做的事情在网上都有很好的报道,但这不是:

这是我的定义:

[DllImport("kernel32.dll")]
public static extern ushort RtlCaptureStackBackTrace(uint FramesToSkip, uint FramesToCapture, out IntPtr BackTrace, out uint BackTraceHash);
这就是我使用它的方式:

IntPtr trace = IntPtr.Zero;
uint traceHash = 0; 
int framesCaptured = 0;

framesCaptured = RtlCaptureStackBackTrace(0, 4, out trace, out traceHash);

int[] frames = new int[framesCaptured];
Marshal.Copy(trace, frames, 0, framesCaptured);
我看到的是framesCaptured为1,这应该是至少4个用户调用加上我的测试应用程序的系统调用


编辑:我应该明确指出,我的问题是,我没有收到正确的堆栈地址信息,或者我使用的是正确的,只是不知道如何传播数据?

它在托管环境中不起作用。解释如下:您的权利,谢谢。相反,我刚刚发现了一个很酷的特性[CallerMemberName],它对我也同样适用。是的,它是在.NET4.5中新引入的。如果您在最初的问题陈述中指定了此要求,您很快就会得到答案:它在托管环境中不起作用。解释如下:您的权利,谢谢。相反,我刚刚发现了一个很酷的特性[CallerMemberName],它对我也同样适用。是的,它是在.NET4.5中新引入的。如果您在原始问题陈述中指定了此要求,您将很快得到答案: