diff --git a/lisa/_kmod.py b/lisa/_kmod.py index ce4396046c31079e664bb78f48628c86dc1cc472..5b0b7d7a4c47ec4ca387c909dcd5194a362e365b 100644 --- a/lisa/_kmod.py +++ b/lisa/_kmod.py @@ -1226,8 +1226,15 @@ class KernelTree(Loggable, SerializeViaConstructor): logger.debug(f'Loaded kernel tree using loader {loader.__name__}') else: + def format_excep(e): + # We expect stderr to be merged in stdout + if isinstance(e, subprocess.CalledProcessError) and e.stdout: + return f'{e}:\n{e.stdout}' + else: + return str(e) + excep_str = "\n".join( - f"{loader.__name__}: {e.__class__.__name__}: {e}" + f"{loader.__name__}: {e.__class__.__name__}: {format_excep(e)}" for loader, e in exceps ) raise ValueError(f'Could not load kernel trees:\n{excep_str}') diff --git a/lisa/trace.py b/lisa/trace.py index a239c0f36f8da53f470c054b09acf053dac43df7..e5e4751a4cc975c41f3606357a5e7655ec0a8461 100644 --- a/lisa/trace.py +++ b/lisa/trace.py @@ -5484,6 +5484,12 @@ class FtraceCollector(CollectorBase, Configurable): """ Thin wrapper around :class:`devlib.collector.ftrace.FtraceCollector`. + .. note:: Events are expected to be provided by the target's kernel, but if + they are not :class:`lisa._kmod.LISAFtraceDynamicKmod` will build a + kernel module to attempt to satisfy the missing events. This will + typically require correct target setup, see + :class:`lisa.target.TargetConf` ``kernel/src`` configurations. + {configurable_params} """