From c2b749e5b4d26b431446f6e6fbeb5df0b3bcca92 Mon Sep 17 00:00:00 2001 From: Asher Baker Date: Sat, 21 Jul 2018 14:06:47 +0100 Subject: [PATCH] Clean things up a bit, add more debug paths --- extension/extension.cpp | 139 ++++++++++++++++++++++------------------ test/test.cpp | 4 +- 2 files changed, 80 insertions(+), 63 deletions(-) diff --git a/extension/extension.cpp b/extension/extension.cpp index f95235f..f2b3378 100644 --- a/extension/extension.cpp +++ b/extension/extension.cpp @@ -427,6 +427,74 @@ class UploadThread: public IThread rootconsole->ConsolePrint("Accelerator upload thread terminated. (canceled = %s)", (cancel ? "true" : "false")); } +#if defined _LINUX + bool UploadSymbolFile(const google_breakpad::CodeModule *module) { + auto debugFile = module->debug_file(); + if (debugFile[0] != '/') { + return false; + } + + printf(">>> Submitting %s\n", debugFile.c_str()); + + auto debugFileDir = google_breakpad::DirName(debugFile); + std::vector debug_dirs{ + debugFileDir, + debugFileDir + "/.debug", + "/usr/lib/debug" + debugFileDir, + }; + + std::ostringstream outputStream; + google_breakpad::DumpOptions options(ALL_SYMBOL_DATA, true); + + { + StderrInhibitor stdrrInhibitor; + + if (!WriteSymbolFile(debugFile, debug_dirs, options, outputStream)) { + outputStream.str(""); + outputStream.clear(); + + // Try again without debug dirs. + if (!WriteSymbolFile(debugFile, {}, options, outputStream)) { + return false; + } + } + } + + auto output = outputStream.str(); + // output = output.substr(0, output.find("\n")); + // printf(">>> %s\n", output.c_str()); + + IWebForm *form = webternet->CreateForm(); + form->AddString("symbol_file", output.c_str()); + + MemoryDownloader data; + IWebTransfer *xfer = webternet->CreateSession(); + xfer->SetFailOnHTTPError(true); + + const char *symbolUrl = g_pSM->GetCoreConfigValue("MinidumpSymbolUrl"); + if (!symbolUrl) symbolUrl = "http://crash.limetech.org/symbols/submit"; + + bool symbolUploaded = xfer->PostAndDownload(symbolUrl, form, &data, NULL); + + if (!symbolUploaded) { + printf(">>> Symbol upload failed: %s (%d)\n", xfer->LastErrorMessage(), xfer->LastErrorCode()); + return false; + } + + int responseSize = data.GetSize(); + char *response = new char[responseSize + 1]; + strncpy(response, data.GetBuffer(), responseSize + 1); + response[responseSize] = '\0'; + while (responseSize > 0 && response[responseSize - 1] == '\n') { + response[--responseSize] = '\0'; + } + printf(">>> Symbol upload complete: %s\n", response); + delete[] response; + + return true; + } +#endif + bool PresubmitCrashDump(const char *path) { google_breakpad::ProcessState processState; google_breakpad::ProcessResult processResult; @@ -513,6 +581,9 @@ class UploadThread: public IThread char *response = new char[responseSize + 1]; strncpy(response, data.GetBuffer(), responseSize + 1); response[responseSize] = '\0'; + while (responseSize > 0 && response[responseSize - 1] == '\n') { + response[--responseSize] = '\0'; + } printf(">>> Presubmit complete: %s\n", response); if (responseSize < 2) { @@ -536,8 +607,8 @@ class UploadThread: public IThread } unsigned int responseCount = responseSize - 2; - if (responseCount != moduleCount) { - printf(">>> Response module list doesn't match sent list (%d != %d)\n", responseCount, moduleCount); + if (responseCount < moduleCount) { + printf(">>> Response module list doesn't match sent list (%d < %d)\n", responseCount, moduleCount); delete[] response; return false; } @@ -550,66 +621,7 @@ class UploadThread: public IThread } auto module = processState.modules()->GetModuleAtIndex(moduleIndex); - - auto debugFile = module->debug_file(); - if (debugFile[0] != '/') { - continue; - } - - printf(">>> Submitting %s\n", debugFile.c_str()); - - auto debugFileDir = google_breakpad::DirName(debugFile); - std::vector debug_dirs{ - debugFileDir, - }; - - std::ostringstream outputStream; - google_breakpad::DumpOptions options(ALL_SYMBOL_DATA, true); - - { - StderrInhibitor stdrrInhibitor; - - if (!WriteSymbolFile(debugFile, debug_dirs, options, outputStream)) { - outputStream.str(""); - outputStream.clear(); - - // Try again without debug dirs. - if (!WriteSymbolFile(debugFile, {}, options, outputStream)) { - // TODO: Something. - continue; - } - } - } - - auto output = outputStream.str(); - // output = output.substr(0, output.find("\n")); - // printf(">>> %s\n", output.c_str()); - - IWebForm *symbolForm = webternet->CreateForm(); - symbolForm->AddString("symbol_file", output.c_str()); - - MemoryDownloader symbolData; - IWebTransfer *symbolXfer = webternet->CreateSession(); - xfer->SetFailOnHTTPError(true); - - const char *symbolUrl = g_pSM->GetCoreConfigValue("MinidumpSymbolUrl"); - if (!symbolUrl) symbolUrl = "http://crash.limetech.org/symbols/submit"; - - bool symbolUploaded = symbolXfer->PostAndDownload(symbolUrl, symbolForm, &symbolData, NULL); - - if (!symbolUploaded) { - printf(">>> Symbol upload failed: %s (%d)\n", symbolXfer->LastErrorMessage(), symbolXfer->LastErrorCode()); - continue; - } - - int symbolResponseSize = symbolData.GetSize(); - char *symbolResponse = new char[symbolResponseSize + 1]; - strncpy(symbolResponse, symbolData.GetBuffer(), symbolResponseSize + 1); - do { - symbolResponse[symbolResponseSize] = '\0'; - } while (symbolResponse[--symbolResponseSize] == '\n'); - printf(">>> Symbol upload complete: %s\n", symbolResponse); - delete[] symbolResponse; + UploadSymbolFile(module); } #else printf(">>> Symbol submission not available on this platform\n"); @@ -651,6 +663,9 @@ class UploadThread: public IThread if (responseSize >= maxlen) responseSize = maxlen - 1; strncpy(response, data.GetBuffer(), responseSize); response[responseSize] = '\0'; + while (responseSize > 0 && response[responseSize - 1] == '\n') { + response[--responseSize] = '\0'; + } } else { g_pSM->Format(response, maxlen, "%s (%d)", xfer->LastErrorMessage(), xfer->LastErrorCode()); } diff --git a/test/test.cpp b/test/test.cpp index 45f6d76..e32c2b1 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -226,11 +226,13 @@ int main(int argc, char *argv[]) continue; } - printf("%s\n", debugFile.c_str()); + // printf("%s\n", debugFile.c_str()); auto debugFileDir = google_breakpad::DirName(debugFile); std::vector debug_dirs{ debugFileDir, + debugFileDir + "/.debug", + "/usr/lib/debug" + debugFileDir, }; std::ostringstream outputStream;