mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-05-12 17:35:49 -04:00
The CrashHandler class encapsulates all functionality around unsafe shutdown detection as well as crash log discovery and log upload. Each (functional) CrashHandler should be initialized with an app launch UUID, which enables the handler to disambiguate a sentinel file for the current app launch from those of prior app launches.
116 lines
4.2 KiB
Plaintext
116 lines
4.2 KiB
Plaintext
/******************************************************************************
|
|
Copyright (C) 2025 by Patrick Heyer <PatTheMav@users.noreply.github.com>
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
******************************************************************************/
|
|
|
|
@import Foundation;
|
|
|
|
#import "CrashHandler.hpp"
|
|
|
|
namespace {
|
|
NSURL *getDiagnosticReportsDirectory()
|
|
{
|
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
|
|
NSArray<NSURL *> *libraryURLs = [fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask];
|
|
|
|
if (libraryURLs.count == 0) {
|
|
blog(LOG_ERROR, "Unable to get macOS user library directory URL");
|
|
return nil;
|
|
}
|
|
|
|
NSURL *diagnosticsReportsURL = [libraryURLs[0] URLByAppendingPathComponent:@"logs/DiagnosticReports"];
|
|
|
|
return diagnosticsReportsURL;
|
|
}
|
|
} // namespace
|
|
|
|
namespace OBS {
|
|
PlatformType CrashHandler::getPlatformType() const
|
|
{
|
|
return PlatformType::macOS;
|
|
}
|
|
|
|
std::filesystem::path CrashHandler::findLastCrashLog() const
|
|
{
|
|
std::filesystem::path crashLogDirectoryPath;
|
|
|
|
NSURL *diagnosticsReportsURL = getDiagnosticReportsDirectory();
|
|
|
|
if (!diagnosticsReportsURL) {
|
|
return crashLogDirectoryPath;
|
|
}
|
|
|
|
BOOL (^enumerationErrorHandler)(NSURL *_Nonnull, NSError *_Nonnull) =
|
|
^BOOL(NSURL *_Nonnull url __unused, NSError *_Nonnull error) {
|
|
blog(LOG_ERROR, "Failed to enumerate diagnostics reports directory: %s",
|
|
error.localizedDescription.UTF8String);
|
|
|
|
return NO;
|
|
};
|
|
|
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
|
|
NSDirectoryEnumerator *dirEnumerator = [fileManager
|
|
enumeratorAtURL:diagnosticsReportsURL
|
|
includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey]
|
|
options:(NSDirectoryEnumerationSkipsHiddenFiles) errorHandler:enumerationErrorHandler];
|
|
|
|
NSMutableArray<NSURL *> *reportCandidates = [NSMutableArray array];
|
|
|
|
for (NSURL *entry in dirEnumerator) {
|
|
NSString *fileName = nil;
|
|
[entry getResourceValue:&fileName forKey:NSURLNameKey error:nil];
|
|
|
|
if ([fileName hasPrefix:@"OBS"] && [fileName hasSuffix:@".ips"]) {
|
|
[reportCandidates addObject:entry];
|
|
}
|
|
}
|
|
|
|
NSArray<NSURL *> *sortedCandidates = [reportCandidates
|
|
sortedArrayUsingComparator:^NSComparisonResult(NSURL *_Nonnull obj1, NSURL *_Nonnull obj2) {
|
|
NSDate *creationDateObj1 = nil;
|
|
NSDate *creationDateObj2 = nil;
|
|
|
|
[obj1 getResourceValue:&creationDateObj1 forKey:NSURLCreationDateKey error:nil];
|
|
[obj2 getResourceValue:&creationDateObj2 forKey:NSURLCreationDateKey error:nil];
|
|
|
|
NSComparisonResult result = [creationDateObj2 compare:creationDateObj1];
|
|
|
|
return result;
|
|
}];
|
|
|
|
if (sortedCandidates.count > 0) {
|
|
NSURL *lastDiagnosticsReport = sortedCandidates[0];
|
|
crashLogDirectoryPath = std::filesystem::u8path(lastDiagnosticsReport.path.UTF8String);
|
|
}
|
|
|
|
return crashLogDirectoryPath;
|
|
}
|
|
|
|
std::filesystem::path CrashHandler::getCrashLogDirectory() const
|
|
{
|
|
std::filesystem::path crashLogDirectoryPath;
|
|
|
|
NSURL *diagnosticsReportsURL = getDiagnosticReportsDirectory();
|
|
|
|
if (diagnosticsReportsURL) {
|
|
crashLogDirectoryPath = std::filesystem::u8path(diagnosticsReportsURL.path.UTF8String);
|
|
}
|
|
|
|
return crashLogDirectoryPath;
|
|
}
|
|
} // namespace OBS
|