diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index 9ed218448..89bd0b1c8 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -535,6 +535,9 @@ Basic.MainMenu.Help.Logs.UploadCurrentLog="Upload &Current Log File"
Basic.MainMenu.Help.Logs.UploadLastLog="Upload &Last Log File"
Basic.MainMenu.Help.Logs.ViewCurrentLog="&View Current Log"
Basic.MainMenu.Help.CheckForUpdates="Check For Updates"
+Basic.MainMenu.Help.CrashLogs="Crash &Reports"
+Basic.MainMenu.Help.CrashLogs.ShowLogs="&Show Crash Reports"
+Basic.MainMenu.Help.CrashLogs.UploadLastLog="Upload &Last Crash Report"
# basic mode settings dialog
Basic.Settings.ProgramRestart="The program must be restarted for these settings to take effect."
diff --git a/UI/forms/OBSBasic.ui b/UI/forms/OBSBasic.ui
index f6a7c32ac..55e66c4da 100644
--- a/UI/forms/OBSBasic.ui
+++ b/UI/forms/OBSBasic.ui
@@ -137,10 +137,19 @@
+
+
+
-
+
Copy
@@ -1582,6 +1591,16 @@
Basic.MainMenu.Help.HelpPortal
+
+
+ Basic.MainMenu.Help.CrashLogs.ShowLogs
+
+
+
+
+ Basic.MainMenu.Help.CrashLogs.UploadLastLog
+
+
diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp
index 4cb276caf..503e5e113 100644
--- a/UI/obs-app.cpp
+++ b/UI/obs-app.cpp
@@ -60,6 +60,7 @@ static log_handler_t def_log_handler;
static string currentLogFile;
static string lastLogFile;
+static string lastCrashLogFile;
bool portable_mode = false;
static bool multi = false;
@@ -1051,6 +1052,11 @@ const char *OBSApp::GetCurrentLog() const
return currentLogFile.c_str();
}
+const char *OBSApp::GetLastCrashLog() const
+{
+ return lastCrashLogFile.c_str();
+}
+
bool OBSApp::TranslateString(const char *lookupVal, const char **out) const
{
for (obs_frontend_translate_ui_cb cb : translatorHooks) {
@@ -1249,6 +1255,9 @@ static void create_log_file(fstream &logFile)
stringstream dst;
get_last_log(false, "obs-studio/logs", lastLogFile);
+#ifdef _WIN32
+ get_last_log(true, "obs-studio/crashes", lastCrashLogFile);
+#endif
currentLogFile = GenerateTimeDateFilename("txt");
dst << "obs-studio/logs/" << currentLogFile.c_str();
diff --git a/UI/obs-app.hpp b/UI/obs-app.hpp
index 53043ac3f..87d6a1c63 100644
--- a/UI/obs-app.hpp
+++ b/UI/obs-app.hpp
@@ -116,6 +116,8 @@ public:
const char *GetLastLog() const;
const char *GetCurrentLog() const;
+ const char *GetLastCrashLog() const;
+
std::string GetVersionString() const;
bool IsPortableMode();
diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp
index b8d65ed36..f1e23a348 100644
--- a/UI/window-basic-main.cpp
+++ b/UI/window-basic-main.cpp
@@ -1655,7 +1655,13 @@ void OBSBasic::OBSInit()
this, SLOT(OpenMultiviewWindow()));
#if !defined(_WIN32) && !defined(__APPLE__)
+ delete ui->actionShowCrashLogs;
+ delete ui->actionUploadLastCrashLog;
+ delete ui->menuCrashLogs;
delete ui->actionCheckForUpdates;
+ ui->actionShowCrashLogs = nullptr;
+ ui->actionUploadLastCrashLog = nullptr;
+ ui->menuCrashLogs = nullptr;
ui->actionCheckForUpdates = nullptr;
#endif
}
@@ -4317,6 +4323,21 @@ void OBSBasic::on_actionViewCurrentLog_triggered()
QDesktopServices::openUrl(url);
}
+void OBSBasic::on_actionShowCrashLogs_triggered()
+{
+ char logDir[512];
+ if (GetConfigPath(logDir, sizeof(logDir), "obs-studio/crashes") <= 0)
+ return;
+
+ QUrl url = QUrl::fromLocalFile(QT_UTF8(logDir));
+ QDesktopServices::openUrl(url);
+}
+
+void OBSBasic::on_actionUploadLastCrashLog_triggered()
+{
+ UploadLog("obs-studio/crashes", App()->GetLastCrashLog());
+}
+
void OBSBasic::on_actionCheckForUpdates_triggered()
{
CheckForUpdates(true);
diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp
index 7b814ec7a..9b4302fa1 100644
--- a/UI/window-basic-main.hpp
+++ b/UI/window-basic-main.hpp
@@ -589,6 +589,9 @@ private slots:
void on_actionViewCurrentLog_triggered();
void on_actionCheckForUpdates_triggered();
+ void on_actionShowCrashLogs_triggered();
+ void on_actionUploadLastCrashLog_triggered();
+
void on_actionEditTransform_triggered();
void on_actionCopyTransform_triggered();
void on_actionPasteTransform_triggered();