<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/24284">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">srs-enb: adds support to the malloc interceptor.<br><br>Adds support to the malloc interceptor for the SRS eNodeB. This interceptor will generate a log file that lists the mallocs, reallocs and frees produced by the srsenb.<br><br>Change-Id: I0078020468f58bdd70b0b5de879eb58192f947a6<br>---<br>M src/osmo_gsm_tester/obj/enb_srs.py<br>M src/osmo_gsm_tester/obj/run_node.py<br>A sysmocom/scenarios/cfg-enb-malloc-interceptor.conf<br>3 files changed, 40 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/obj/enb_srs.py b/src/osmo_gsm_tester/obj/enb_srs.py</span><br><span>index 69aa095..93272c4 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/enb_srs.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/enb_srs.py</span><br><span>@@ -37,6 +37,7 @@</span><br><span>     schema.register_resource_schema('enb', resource_schema)</span><br><span> </span><br><span>     config_schema = {</span><br><span style="color: hsl(120, 100%, 40%);">+        'enable_malloc_interceptor': schema.BOOL_STR,</span><br><span>         'enable_pcap': schema.BOOL_STR,</span><br><span>         'enable_tracing': schema.BOOL_STR,</span><br><span>         'enable_ul_qam64': schema.BOOL_STR,</span><br><span>@@ -60,6 +61,7 @@</span><br><span>     S1AP_PCAPFILE = 'srsenb_s1ap.pcap'</span><br><span>     TRACINGFILE = 'srsenb_tracing.log'</span><br><span>     METRICSFILE = 'srsenb_metrics.csv'</span><br><span style="color: hsl(120, 100%, 40%);">+    INTERCEPTORFILE = 'srsenb_minterceptor.log'</span><br><span> </span><br><span>     def __init__(self, testenv, conf):</span><br><span>         super().__init__(testenv, conf, srsENB.BINFILE)</span><br><span>@@ -72,6 +74,7 @@</span><br><span>         self.config_rr_file = None</span><br><span>         self.config_drb_file = None</span><br><span>         self.tracing_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.interceptor_file = None</span><br><span>         self.log_file = None</span><br><span>         self.pcap_file = None</span><br><span>         self.s1ap_pcap_file = None</span><br><span>@@ -87,9 +90,11 @@</span><br><span>         self.remote_s1ap_pcap_file = None</span><br><span>         self.remote_tracing_file = None</span><br><span>         self.remote_metrics_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_interceptor_file = None</span><br><span>         self.enable_pcap = False</span><br><span>         self.enable_ul_qam64 = False</span><br><span>         self.enable_tracing = False</span><br><span style="color: hsl(120, 100%, 40%);">+        self.enable_malloc_interceptor = False</span><br><span>         self.metrics_file = None</span><br><span>         self.have_metrics_file = False</span><br><span>         self.stop_sleep_time = 6 # We require at most 5s to stop</span><br><span>@@ -134,6 +139,12 @@</span><br><span>             except Exception as e:</span><br><span>                 self.log(repr(e))</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        if self.enable_malloc_interceptor:</span><br><span style="color: hsl(120, 100%, 40%);">+            try:</span><br><span style="color: hsl(120, 100%, 40%);">+                self.rem_host.scpfrom('scp-back-interceptor', self.remote_interceptor_file, self.interceptor_file)</span><br><span style="color: hsl(120, 100%, 40%);">+            except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+                self.log(repr(e))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         # Collect KPIs for each TC</span><br><span>         self.testenv.test().set_kpis(self.get_kpi_tree())</span><br><span>         # Clean up for parent class:</span><br><span>@@ -244,10 +255,23 @@</span><br><span> </span><br><span>     def start_remotely(self):</span><br><span>         remote_env = { 'LD_LIBRARY_PATH': self.remote_inst.child('lib') }</span><br><span style="color: hsl(120, 100%, 40%);">+        # Add the malloc interceptor env variable when it's required.</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.enable_malloc_interceptor:</span><br><span style="color: hsl(120, 100%, 40%);">+            path = self._run_node.lib_path_malloc_interceptor()</span><br><span style="color: hsl(120, 100%, 40%);">+            if not path:</span><br><span style="color: hsl(120, 100%, 40%);">+                raise log.Error('Could not get the environment variables. Aborting')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            self.log(f'Setting LD_PRELOAD var to value: {path}')</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_env['LD_PRELOAD'] = path</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         remote_binary = self.remote_inst.child('bin', srsENB.BINFILE)</span><br><span>         args = (remote_binary, self.remote_config_file)</span><br><span>         args += tuple(self._additional_args)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        # Force the output of the malloc interceptor to the interceptor_file.</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.enable_malloc_interceptor:</span><br><span style="color: hsl(120, 100%, 40%);">+            args += tuple([f" 2> {self.remote_interceptor_file}"])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         self.process = self.rem_host.RemoteProcessSafeExit(srsENB.BINFILE, self.remote_run_dir, args, remote_env=remote_env, wait_time_sec=7)</span><br><span>         self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span>@@ -287,6 +311,7 @@</span><br><span>         self.s1ap_pcap_file = self.run_dir.child(srsENB.S1AP_PCAPFILE)</span><br><span>         self.metrics_file = self.run_dir.child(srsENB.METRICSFILE)</span><br><span>         self.tracing_file = self.run_dir.child(srsENB.TRACINGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.interceptor_file = self.run_dir.child(srsENB.INTERCEPTORFILE)</span><br><span> </span><br><span>         if not self._run_node.is_local():</span><br><span>             self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span>@@ -310,6 +335,7 @@</span><br><span>             self.remote_s1ap_pcap_file = self.remote_run_dir.child(srsENB.S1AP_PCAPFILE)</span><br><span>             self.remote_metrics_file = self.remote_run_dir.child(srsENB.METRICSFILE)</span><br><span>             self.remote_tracing_file = self.remote_run_dir.child(srsENB.TRACINGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_interceptor_file = self.remote_run_dir.child(srsENB.INTERCEPTORFILE)</span><br><span> </span><br><span>         values = super().configure(['srsenb'])</span><br><span> </span><br><span>@@ -331,6 +357,9 @@</span><br><span>                                              s1ap_pcap_filename=s1ap_pcapfile,</span><br><span>                                              )))</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        # Retrieve the malloc interceptor option.</span><br><span style="color: hsl(120, 100%, 40%);">+        self.enable_malloc_interceptor = util.str2bool(values['enb'].get('enable_malloc_interceptor', 'false'))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         # Convert parsed boolean string to Python boolean:</span><br><span>         self.enable_pcap = util.str2bool(values['enb'].get('enable_pcap', 'false'))</span><br><span>         config.overlay(values, dict(enb={'enable_pcap': self.enable_pcap}))</span><br><span>diff --git a/src/osmo_gsm_tester/obj/run_node.py b/src/osmo_gsm_tester/obj/run_node.py</span><br><span>index 676c262..3549fc5 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/run_node.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/run_node.py</span><br><span>@@ -30,7 +30,7 @@</span><br><span>     T_LOCAL = 'local'</span><br><span>     T_REM_SSH = 'ssh'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, type=None, run_addr=None, ssh_user=None, ssh_addr=None, run_label=None, label=None, ssh_port=None, adb_serial_id=None):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, type=None, run_addr=None, ssh_user=None, ssh_addr=None, run_label=None, label=None, ssh_port=None, adb_serial_id=None, lib_path_malloc_interceptor=None):</span><br><span>         super().__init__(log.C_RUN, 'runnode')</span><br><span>         self._type = type</span><br><span>         self._run_addr = run_addr</span><br><span>@@ -40,6 +40,7 @@</span><br><span>         self._label = label</span><br><span>         self._ssh_port = ssh_port</span><br><span>         self._adb_serial_id = adb_serial_id</span><br><span style="color: hsl(120, 100%, 40%);">+        self._lib_path_malloc_interceptor = lib_path_malloc_interceptor</span><br><span>         if not self._type:</span><br><span>             raise log.Error('run_type not set')</span><br><span>         if not self._run_addr:</span><br><span>@@ -59,7 +60,8 @@</span><br><span>         return cls(conf.get('run_type', None), conf.get('run_addr', None),</span><br><span>                    conf.get('ssh_user', None), conf.get('ssh_addr', None),</span><br><span>                    conf.get('run_label', None), conf.get('label', None),</span><br><span style="color: hsl(0, 100%, 40%);">-                   conf.get('ssh_port', None), conf.get('adb_serial_id', None))</span><br><span style="color: hsl(120, 100%, 40%);">+                   conf.get('ssh_port', None), conf.get('adb_serial_id', None),</span><br><span style="color: hsl(120, 100%, 40%);">+                   conf.get('lib_path_malloc_interceptor', None))</span><br><span> </span><br><span>     @classmethod</span><br><span>     def schema(cls):</span><br><span>@@ -72,6 +74,7 @@</span><br><span>             'label': schema.STR,</span><br><span>             'ssh_port': schema.STR,</span><br><span>             'adb_serial_id': schema.STR,</span><br><span style="color: hsl(120, 100%, 40%);">+            'lib_path_malloc_interceptor': schema.STR,</span><br><span>             }</span><br><span>         return resource_schema</span><br><span> </span><br><span>@@ -105,4 +108,7 @@</span><br><span>     def adb_serial_id(self):</span><br><span>         return self._adb_serial_id</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def lib_path_malloc_interceptor(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._lib_path_malloc_interceptor</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/sysmocom/scenarios/cfg-enb-malloc-interceptor.conf b/sysmocom/scenarios/cfg-enb-malloc-interceptor.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..9f8cc0a</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/cfg-enb-malloc-interceptor.conf</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+config:</span><br><span style="color: hsl(120, 100%, 40%);">+  enb:</span><br><span style="color: hsl(120, 100%, 40%);">+    enable_malloc_interceptor: true</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/24284">change 24284</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/24284"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gsm-tester </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I0078020468f58bdd70b0b5de879eb58192f947a6 </div>
<div style="display:none"> Gerrit-Change-Number: 24284 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: alealcon <alejandro.leal@srs.io> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>