要在C++程序出錯(cuò)時(shí)自動(dòng)生成堆棧跟蹤,可以使用一些第三方庫(kù)或操作系統(tǒng)提供的API
backward-cpp
庫(kù):backward-cpp
是一個(gè)輕量級(jí)的、跨平臺(tái)的C++堆棧跟蹤庫(kù)。首先,你需要安裝這個(gè)庫(kù)。在大多數(shù)Linux發(fā)行版中,可以使用包管理器來(lái)安裝。例如,在Ubuntu上:
sudo apt-get install libbackward-cpp-dev
然后,在你的C++代碼中包含庫(kù)并設(shè)置信號(hào)處理函數(shù):
#include<iostream>
#include<signal.h>
#include <backward.hpp>
void signal_handler(int sig) {
backward::StackTrace st;
st.load_here(32);
backward::Printer p;
p.print(st, std::cerr);
exit(sig);
}
int main() {
signal(SIGSEGV, signal_handler);
signal(SIGABRT, signal_handler);
// 你的代碼...
}
glibc
的backtrace
和backtrace_symbols
函數(shù)(僅限于Linux):首先,需要在編譯時(shí)鏈接execinfo
庫(kù):
g++ -o your_program your_program.cpp -rdynamic -lexecinfo
然后,在你的C++代碼中設(shè)置信號(hào)處理函數(shù):
#include<iostream>
#include<signal.h>
#include <execinfo.h>
#include <unistd.h>
void signal_handler(int sig) {
void* array[32];
int size = backtrace(array, 32);
char** symbols = backtrace_symbols(array, size);
std::cerr << "Error: signal "<< sig<< std::endl;
for (int i = 0; i< size; ++i) {
std::cerr<< symbols[i]<< std::endl;
}
free(symbols);
exit(sig);
}
int main() {
signal(SIGSEGV, signal_handler);
signal(SIGABRT, signal_handler);
// 你的代碼...
}
這兩種方法都可以在程序出錯(cuò)時(shí)生成堆棧跟蹤。你可以根據(jù)你的需求和平臺(tái)選擇合適的方法。