考慮以下程式:
#include <atomic>
#include <thread>
#include <iostream>
#include <string>
#include <windows.h>
std::atomic<int> crashId;
void threadFunction(int id) {
while (id != crashId) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
int* p = nullptr;
*p = id;
}
int main() {
std::thread t1(&threadFunction, 1);
std::thread t2(&threadFunction, 1);
int id;
std::cin >> id;
crashId = id;
while (true) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
我啟動程式(內置于發布模式)并去吃午飯。當我回來時,一位同事輸入了 1 或 2。
如何找出哪個執行緒崩潰了?或者,我怎樣才能重寫程式,以便第二天可以找到它?
我嘗試了事件查看器。那似乎只是向我的 .exe 報告行程 ID 和檔案路徑。
如果我讓每個執行緒在單獨的 .dll 中運行,我會在事件查看器日志中看到這個嗎?
uj5u.com熱心網友回復:
在 Windows 上,您可以設定與程式名稱關聯的注冊表項,以便在發生崩潰時生成轉儲檔案
此處和此處的示例說明 (我始終建議生成“完整”崩潰轉儲)
有了故障轉儲,您可以將其加載到 Windbg 甚至 Visual Studio 等工具中,以觀察呼叫堆疊并查看變數值。
您可能需要在工具的符號路徑中包含與 EXE 關聯的 PDB 檔案才能查看函式和變數名稱。優化的構建通常更難除錯,但是有一些編譯器開關可以生成更好(和更大)的 PDB 檔案,這使得零售除錯幾乎與非優化構建一樣好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/433437.html
上一篇:將檔案夾中的檔案名輸出到文本檔案
