前几天我发布了一个关于使用MSYS / Mingw的win32 API堆栈跟踪实现的问题:Win32 API stack walk with MinGW/MSYS?
显式加载dll的提示是正确的解决方案。所以我重新尝试使用关于此提示的win32 CaptureStackBackTrace API机制来实现堆栈跟踪。加载dll工作正常:
// Load the RTLCapture context function:
HINSTANCE kernel32 = LoadLibrary("Kernel32.dll");
if(kernel32 != NULL){
std::cout << "Try to load method from kernel32.dll: CaptureStackBackTrace" << std::endl;
typedef USHORT (*CaptureStackBackTraceType)(ULONG FramesToSkip, ULONG FramesToCapture, void* BackTrace, ULONG* BackTraceHash);
CaptureStackBackTraceType func = (CaptureStackBackTraceType) GetProcAddress( kernel32, "RtlCaptureStackBackTrace" );
if(func==NULL){
std::cout << "Handle for CaptureStackBackTrace could't loded! Stop demo!."<< std::endl;
FreeLibrary(kernel32);
kernel32 = NULL;
func = NULL;
exit(1);
}
void *array[63];
int i,num = 0;
std::cout << "Try to call CaptureStackBackTrace..."<< std::endl;
num = CaptureStackBackTraceType( 1, 32, array, NULL );}
但是如果我调用CaptureStackBackTraceType方法并在类型转换问题中运行,我会遇到麻烦:
stacktrace.cpp:138:错误:功能转换表达式列表被视为复合e
上的表达
stacktrace.cpp:138:错误:从USHORT (*)(ULONG, ULONG, voi
d*, ULONG*)' to
USHORT'
我认为这个问题可能是由于MSYS / MinGW和dll定义之间的类型差异造成的。明确定义USHORT #define USHORT unsigned short无效。
有谁知道如何解决这个问题? 我会非常感激任何提示。
祝你好运, 基督教
答案 0 :(得分:2)
在最后一个版本中,您需要使用函数指针func
来调用该函数。所以它应该是num = func( 1, 32, array, NULL );
否则,您正在尝试创建CaptureStackBackTraceType
类型的未命名对象,并尝试将其转换为int
。由于转换不存在,编译器发出错误。