mingw崩溃日志分析。
This commit is contained in:
75
dumpDemo/main.cpp
Normal file
75
dumpDemo/main.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
#include <chrono>
|
||||
#include <ctime>
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <thread>
|
||||
|
||||
#include "crashdump.h"
|
||||
|
||||
long __stdcall DumpCall(EXCEPTION_POINTERS* excp)
|
||||
{
|
||||
// 1. 生成带时间戳的文件名
|
||||
auto now = std::chrono::system_clock::now();
|
||||
auto now_time_t = std::chrono::system_clock::to_time_t(now);
|
||||
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
|
||||
|
||||
std::ostringstream oss;
|
||||
oss << std::put_time(std::localtime(&now_time_t), "%Y%m%d_%H%M%S") << "_" << std::setfill('0') << std::setw(3)
|
||||
<< now_ms.count() << "_crash.log";
|
||||
|
||||
std::string filename = oss.str();
|
||||
|
||||
// 2. 获取崩溃信息
|
||||
CrashDump dump(excp);
|
||||
std::string crashInfo = dump.GetExceptionInfo();
|
||||
|
||||
// 3. 写入文件 (C++11 风格)
|
||||
try {
|
||||
std::ofstream outfile(filename, std::ios::out | std::ios::trunc);
|
||||
if (outfile) {
|
||||
outfile << "=== Crash Dump ===\n\n";
|
||||
outfile << "Timestamp: " << std::put_time(std::localtime(&now_time_t), "%Y-%m-%d %H:%M:%S") << "."
|
||||
<< std::setfill('0') << std::setw(3) << now_ms.count() << "\n";
|
||||
outfile << crashInfo;
|
||||
outfile << "\n=== End of Dump ===";
|
||||
|
||||
// 确保数据写入磁盘
|
||||
outfile.flush();
|
||||
if (outfile.good()) {
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
}
|
||||
}
|
||||
} catch (...) {
|
||||
// 文件写入失败的备用方案
|
||||
OutputDebugStringA(("Failed to write crash dump to " + filename).c_str());
|
||||
}
|
||||
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
}
|
||||
|
||||
void tasks()
|
||||
{
|
||||
int c = 5;
|
||||
while (--c > 0) {
|
||||
std::this_thread::sleep_for(std::chrono::seconds(1));
|
||||
}
|
||||
int* p = nullptr;
|
||||
*p = 11;
|
||||
std::cout << "over..." << std::endl;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
SetUnhandledExceptionFilter(DumpCall);
|
||||
|
||||
std::cout << "Hello World!" << std::endl;
|
||||
|
||||
std::thread thread(tasks);
|
||||
thread.join();
|
||||
|
||||
std::cout << "End." << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user