| Index: telemetry/telemetry/internal/backends/chrome/desktop_browser_backend.py
|
| diff --git a/telemetry/telemetry/internal/backends/chrome/desktop_browser_backend.py b/telemetry/telemetry/internal/backends/chrome/desktop_browser_backend.py
|
| index 3e9ac8e1f839a29f8b5f7d00a6266e620dd7a56f..e10389d58410a7f816cd73c70f70564aa3ccf1a6 100644
|
| --- a/telemetry/telemetry/internal/backends/chrome/desktop_browser_backend.py
|
| +++ b/telemetry/telemetry/internal/backends/chrome/desktop_browser_backend.py
|
| @@ -114,6 +114,7 @@ class DesktopBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
|
| self._proc = None
|
| self._tmp_profile_dir = None
|
| self._tmp_output_file = None
|
| + self._most_recent_symbolized_minidump_paths = set([])
|
|
|
| self._executable = executable
|
| if not self._executable:
|
| @@ -332,7 +333,7 @@ class DesktopBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
|
| except IOError:
|
| return ''
|
|
|
| - def _GetMostRecentCrashpadMinidump(self):
|
| + def _GetAllCrashpadMinidumps(self):
|
| os_name = self.browser.platform.GetOSName()
|
| arch_name = self.browser.platform.GetArchName()
|
| try:
|
| @@ -391,12 +392,19 @@ class DesktopBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
|
| logging.warning('Crashpad report expected valid keys'
|
| ' "Path" and "Creation time": %s', e)
|
|
|
| + return reports_list
|
| +
|
| + def _GetMostRecentCrashpadMinidump(self):
|
| + reports_list = self._GetAllCrashpadMinidumps()
|
| if reports_list:
|
| _, most_recent_report_path = max(reports_list)
|
| return most_recent_report_path
|
|
|
| return None
|
|
|
| + def _GetBreakPadMinidumpPaths(self):
|
| + return glob.glob(os.path.join(self._tmp_minidump_dir, '*.dmp'))
|
| +
|
| def _GetMostRecentMinidump(self):
|
| # Crashpad dump layout will be the standard eventually, check it first.
|
| most_recent_dump = self._GetMostRecentCrashpadMinidump()
|
| @@ -404,7 +412,7 @@ class DesktopBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
|
| # Typical breakpad format is simply dump files in a folder.
|
| if not most_recent_dump:
|
| logging.info('No minidump found via crashpad_database_util')
|
| - dumps = glob.glob(os.path.join(self._tmp_minidump_dir, '*.dmp'))
|
| + dumps = self._GetBreakPadMinidumpPaths()
|
| if dumps:
|
| most_recent_dump = heapq.nlargest(1, dumps, os.path.getmtime)[0]
|
| if most_recent_dump:
|
| @@ -502,13 +510,42 @@ class DesktopBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
|
| if not most_recent_dump:
|
| return (False, 'No crash dump found.')
|
| logging.info('Minidump found: %s' % most_recent_dump)
|
| - stack = self._GetStackFromMinidump(most_recent_dump)
|
| + return self._InternalSymbolizeMinidump(most_recent_dump)
|
| +
|
| + def GetMostRecentMinidumpPath(self):
|
| + return self._GetMostRecentMinidump()
|
| +
|
| + def GetAllMinidumpPaths(self):
|
| + reports_list = self._GetAllCrashpadMinidumps()
|
| + if reports_list:
|
| + return [report[1] for report in reports_list]
|
| + else:
|
| + logging.info('No minidump found via crashpad_database_util')
|
| + dumps = self._GetBreakPadMinidumpPaths()
|
| + if dumps:
|
| + logging.info('Found minidump via globbing in minidump dir')
|
| + return dumps
|
| + return None
|
| +
|
| + def GetAllUnsymbolizedMinidumpPaths(self):
|
| + minidump_paths = set(self.GetAllMinidumpPaths())
|
| + # If we have already symbolized paths remove them from the list
|
| + unsymbolized_paths = (minidump_paths
|
| + - self._most_recent_symbolized_minidump_paths)
|
| + return list(unsymbolized_paths)
|
| +
|
| + def SymbolizeMinidump(self, minidump_path):
|
| + return self._InternalSymbolizeMinidump(minidump_path)
|
| +
|
| + def _InternalSymbolizeMinidump(self, minidump_path):
|
| + stack = self._GetStackFromMinidump(minidump_path)
|
| if not stack:
|
| - cloud_storage_link = self._UploadMinidumpToCloudStorage(most_recent_dump)
|
| + cloud_storage_link = self._UploadMinidumpToCloudStorage(minidump_path)
|
| error_message = ('Failed to symbolize minidump. Raw stack is uploaded to'
|
| ' cloud storage: %s.' % cloud_storage_link)
|
| return (False, error_message)
|
|
|
| + self._most_recent_symbolized_minidump_paths.add(minidump_path)
|
| return (True, stack)
|
|
|
| def __del__(self):
|
|
|