Dav*_*vid 5 c++ windows visual-studio-2010
我正试图尽快捕获调用堆栈.现在这就是我所拥有的:
void* addrs[10] = {};
DWORD hash;
RtlCaptureStackBackTrace(0, 10, addrs, &hash);
for( size_t i = 0; i <10; ++i )
{
std::cout << addrs[i] << '\n';
}
Run Code Online (Sandbox Code Playgroud)
这是用于内存跟踪系统,因此如果以后(在某些用户驱动的事件中)可以变成人类可读的东西,我最终会得到一个地址数组.
addrs
变成人类可读的东西?RtlCaptureStackBackTrace
?编辑:
我使用SymFromAddr
和将地址转换为人类可读的信息SymGetLineFromAddr64
.然而,我的版本new
,它使用CaptureStackBackTrace
大约需要30倍的时间比原来几乎所有的时间是因为堆栈跟踪.我还在寻找更快的解决方案!
有没有跨平台的方法来捕获调用堆栈?
不幸的是,快速的答案是这是不可能的。不同的编译器和平台将以不同的方式组织堆栈,并且如果没有编译器的“帮助”,您将无法准确地追溯堆栈......在使用堆栈的平台上您可以做的最多的事情 -帧基指针将使用EBP
或中的值向上移动堆栈RBP
,甚至这取决于您运行的是 32 位 x86 可执行文件还是 x86_64 可执行文件。此外,管理 UNIX 应用程序二进制接口 (ABI) 和 Windows ABI 的规则完全不同。所以一般来说,您最终将不得不支持至少四种不同的可能性:
请记住,UNIX 64 位 ABI 允许编译器选择是否支持堆栈帧基指针……因此不能保证基指针的使用;编译器可以简单地选择根据堆栈指针本身引用所有堆栈变量,而不使用单独的基指针。这仍然被认为符合 UNIX 64 位 ABI。
正如您所看到的,由于存在所有这些可能的变化,您将很难创建可靠的跨平台堆栈跟踪器。最好的选择是使用适合您目标平台的可用工具。如果您需要支持多个平台,那么不幸的是,当您利用特定于平台的工具来帮助您可靠地执行堆栈跟踪时,将会出现一定程度的代码重复。
归档时间: |
|
查看次数: |
889 次 |
最近记录: |