我知道这StackTrace
门课,但是由于所有的符号查找,我正在做的事情太慢了。
我听说过这个RtlCaptureStackBackTrace
功能,Kernel32.dll
但我似乎无法让它正常工作。我对 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 个用户调用加上我的测试应用程序的系统调用。
编辑:我可能应该明确一点,我的问题是我做错了什么RtlCaptureStackBackTrace
,我没有收到正确的堆栈地址信息,或者我是否正确使用它并且只是不知道如何传播数据?