Index: tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py |
diff --git a/tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py b/tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py |
index eb976e8395931ae804de5eb030aeeabb171bde79..6a16a0bd69bebbdeadd0705c58083f827848516a 100644 |
--- a/tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py |
+++ b/tools/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py |
@@ -2,6 +2,7 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
+import json |
import logging |
import socket |
import time |
@@ -28,6 +29,10 @@ class TracingHasNotRunException(Exception): |
pass |
+class TracingUnexpectedResponseException(Exception): |
+ pass |
+ |
+ |
class TracingBackend(object): |
def __init__(self, devtools_port): |
self._inspector_websocket = inspector_websocket.InspectorWebsocket() |
@@ -90,6 +95,41 @@ class TracingBackend(object): |
trace_data_builder.AddEventsTo( |
trace_data_module.CHROME_TRACE_PART, self._trace_events) |
+ def DumpMemory(self, timeout=30): |
+ """Dumps memory. |
+ |
+ Returns: |
+ GUID of the generated dump if successful, None otherwise. |
+ |
+ Raises: |
+ TracingTimeoutException: If more than |timeout| seconds has passed |
+ since the last time any data is received. |
+ TracingUnrecoverableException: If there is a websocket error. |
+ TracingUnexpectedResponseException: If the response contains an error |
+ or does not contain the expected result. |
+ """ |
+ request = { |
+ 'method': 'Tracing.requestMemoryDump' |
+ } |
+ try: |
+ response = self._inspector_websocket.SyncRequest(request, timeout) |
+ except websocket.WebSocketTimeoutException: |
+ raise TracingTimeoutException |
+ except (socket.error, websocket.WebSocketException, |
+ inspector_websocket.WebSocketDisconnected): |
+ raise TracingUnrecoverableException |
+ |
+ if ('error' in response or |
+ 'result' not in response or |
+ 'success' not in response['result'] or |
+ 'dumpGuid' not in response['result']): |
+ raise TracingUnexpectedResponseException( |
+ 'Inspector returned unexpected response for ' |
+ 'Tracing.requestMemoryDump:\n' + json.dumps(response, indent=2)) |
+ |
+ result = response['result'] |
+ return result['dumpGuid'] if result['success'] else None |
+ |
def _CollectTracingData(self, timeout): |
"""Collects tracing data. Assumes that Tracing.end has already been sent. |