commit 932380034c974a5c4ee1d9f08f4f477d87f05573
parent 45fd8b48b2906e1b83e0307502e655ce430ef702
Author: Edgar Chen <echen@mozilla.com>
Date: Mon, 3 Nov 2025 16:10:41 +0000
Bug 1261180 - Make marionette mach support --debugger; r=whimboo
Differential Revision: https://phabricator.services.mozilla.com/D265271
Diffstat:
2 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/testing/marionette/client/marionette_driver/geckoinstance.py b/testing/marionette/client/marionette_driver/geckoinstance.py
@@ -203,6 +203,7 @@ class GeckoInstance:
profile=None,
addons=None,
app_args=None,
+ debugger_info=None,
symbols_path=None,
gecko_log=None,
prefs=None,
@@ -212,6 +213,7 @@ class GeckoInstance:
):
self.runner_class = Runner
self.app_args = app_args or []
+ self.debugger_info = debugger_info
self.runner = None
self.symbols_path = symbols_path
self.binary = bin
@@ -380,7 +382,16 @@ class GeckoInstance:
def start(self):
self._update_profile(self.profile)
self.runner = self.runner_class(**self._get_runner_args())
- self.runner.start()
+
+ # debugger information
+ debug_args = None
+ interactive = False
+
+ if self.debugger_info:
+ debug_args = [self.debugger_info.path] + self.debugger_info.args
+ interactive = self.debugger_info.interactive
+
+ self.runner.start(debug_args, interactive)
def _get_runner_args(self):
process_args = {
diff --git a/testing/marionette/harness/marionette_harness/runner/base.py b/testing/marionette/harness/marionette_harness/runner/base.py
@@ -15,6 +15,7 @@ from argparse import ArgumentParser
from collections import defaultdict
from copy import deepcopy
+import mozdebug
import mozinfo
import moznetwork
import mozprofile
@@ -411,6 +412,17 @@ class BaseMarionetteArguments(ArgumentParser):
" Pass in the debugger you want to use, eg pdb or ipdb.",
)
self.add_argument(
+ "--debugger",
+ default=None,
+ help="Debugger binary to run tests in. Program name or path",
+ )
+ self.add_argument(
+ "--debugger-args",
+ dest="debugger_args",
+ default=None,
+ help="Arguments to pass to the debugger",
+ )
+ self.add_argument(
"--disable-fission",
action="store_true",
dest="disable_fission",
@@ -530,6 +542,15 @@ class BaseMarionetteArguments(ArgumentParser):
args.app_args.append("-jsdebugger")
args.socket_timeout = None
+ if args.debugger_args and not args.debugger:
+ self.error("--debugger-args requires --debugger")
+
+ if args.debugger:
+ # Valgrind and some debuggers may cause Gecko to start slowly.
+ # Make sure to wait long enough to connect.
+ args.startup_timeout = 900
+ args.socket_timeout = None
+
args.prefs = self._get_preferences(args.prefs_files, args.prefs_args)
for container in self.argument_containers:
@@ -605,6 +626,8 @@ class BaseMarionetteTestRunner:
address=None,
app=None,
app_args=None,
+ debugger=None,
+ debugger_args=None,
binary=None,
profile=None,
logger=None,
@@ -644,6 +667,8 @@ class BaseMarionetteTestRunner:
self.address = address
self.app = app
self.app_args = app_args or []
+ self.debugger = debugger
+ self.debugger_args = debugger_args
self.bin = binary
self.emulator = emulator
self.profile = profile
@@ -831,12 +856,18 @@ class BaseMarionetteTestRunner:
"symbols_path": self.symbols_path,
}
if self.bin or self.emulator:
+ debugger_info = None
+ if self.debugger:
+ debugger_info = mozdebug.get_debugger_info(
+ self.debugger, self.debugger_args
+ )
kwargs.update(
{
"host": "127.0.0.1",
"port": 2828,
"app": self.app,
"app_args": self.app_args,
+ "debugger_info": debugger_info,
"profile": self.profile,
"addons": self.addons,
"gecko_log": self.gecko_log,