在linux下可以通过execinfo.h下的backtrace_symbols和backtrace来实现backtrack。但是windows中没有execinfo.h。
因此参考了这篇文章,使用CaptureStackBackTrace和SymFromAddr实现。代码如下:
void Backtrace(std::vector<std::string>& bt, int size, int skip){
void* array[100];
HANDLE process = GetCurrentProcess();
SYMBOL_INFO* symbol=nullptr;
SymInitialize( process, NULL, TRUE );
size_t s = CaptureStackBackTrace(0, 100, array, nullptr);
std::cout<<s;
symbol = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );
symbol->MaxNameLen = 255;
symbol->SizeOfStruct = sizeof( SYMBOL_INFO );
for(size_t i = 0; i < s; i++){
SymFromAddr(process, (DWORD64)(array[i]), 0, symbol );
if(symbol==NULL){
std::cout<<"backtrace error";
}
bt.push_back(symbol->Name);
}
free(symbol);
free(array);
}
但是之后运行发现报错undefined reference to,网上查找发现需要在Dev中进行编译选项设置。
选择 “工具”》“编译选项”进行如下设置。添加“-ldbghelp”。
之后就能运行了。