void LuaProfilerReport() { printf("Generating profiling report..\n"); if (FILE* f = fopen("tundra.prof", "w")) { DumpReport(f); fclose(f); } else { fprintf(stderr, "Failed to write tundra.prof\n"); } }
NS_IMETHODIMP nsStatusReporterManager::DumpReports() { static unsigned number = 1; nsresult rv; int thispid = 181818; thispid = getpid(); nsCString filename("status-reports-"); filename.AppendInt(thispid); filename.Append('-'); filename.AppendInt(number++); filename.AppendLiteral(".json"); // Open a file in NS_OS_TEMP_DIR for writing. // The file is initialized as "incomplete-status-reports-pid-number.json" in the // begining, it will be rename as "status-reports-pid-number.json" in the end. nsCOMPtr<nsIFile> tmpFile; rv = nsDumpUtils::OpenTempFile(NS_LITERAL_CSTRING("incomplete-") + filename, getter_AddRefs(tmpFile), NS_LITERAL_CSTRING("status-reports")); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } nsCOMPtr<nsIFileOutputStream> ostream = do_CreateInstance("@mozilla.org/network/file-output-stream;1"); rv = ostream->Init(tmpFile, -1, -1, 0); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } //Write the reports to the file DUMP(ostream, "{\n\"subject\":\"about:service reports\",\n"); DUMP(ostream, "\"reporters\": [ "); nsCOMPtr<nsISimpleEnumerator> e; bool more, first = true; EnumerateReporters(getter_AddRefs(e)); while (NS_SUCCEEDED(e->HasMoreElements(&more)) && more) { nsCOMPtr<nsISupports> supports; e->GetNext(getter_AddRefs(supports)); nsCOMPtr<nsIStatusReporter> r = do_QueryInterface(supports); nsCString process; rv = r->GetProcess(process); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } nsCString name; rv = r->GetName(name); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } nsCString description; rv = r->GetDescription(description); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } if (first) { first = false; } else { DUMP(ostream, ","); } rv = DumpReport(ostream, process, name, description); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } DUMP(ostream, "\n]\n}\n"); rv = ostream->Close(); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } // Rename the status reports file nsCOMPtr<nsIFile> srFinalFile; rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(srFinalFile)); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } #ifdef ANDROID rv = srFinalFile->AppendNative(NS_LITERAL_CSTRING("status-reports")); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } #endif rv = srFinalFile->AppendNative(filename); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } rv = srFinalFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0600); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } nsAutoString srActualFinalFilename; rv = srFinalFile->GetLeafName(srActualFinalFilename); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } rv = tmpFile->MoveTo(/* directory */ nullptr, srActualFinalFilename); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } return NS_OK; }