|
24 | 24 | import os
|
25 | 25 | import sys
|
26 | 26 | import time
|
| 27 | +import importlib.resources |
27 | 28 | import json
|
28 | 29 | import re
|
| 30 | +import shlex |
29 | 31 | import types
|
30 | 32 | import sage.misc.flatten
|
31 | 33 | import sage.misc.randstate as randstate
|
@@ -1183,92 +1185,95 @@ def run_val_gdb(self, testing=False):
|
1183 | 1185 | sage: DD = DocTestDefaults(gdb=True)
|
1184 | 1186 | sage: DC = DocTestController(DD, ["hello_world.py"])
|
1185 | 1187 | sage: DC.run_val_gdb(testing=True)
|
1186 |
| - exec gdb -x "...sage-gdb-commands" --args sage-runtests --serial --timeout=0 hello_world.py |
| 1188 | + exec gdb -x ...sage-gdb-commands... --args sage-runtests --serial --timeout=0 hello_world.py |
1187 | 1189 |
|
1188 | 1190 | ::
|
1189 | 1191 |
|
1190 | 1192 | sage: DD = DocTestDefaults(valgrind=True, optional="all", timeout=172800)
|
1191 | 1193 | sage: DC = DocTestController(DD, ["hello_world.py"])
|
1192 | 1194 | sage: DC.run_val_gdb(testing=True)
|
1193 |
| - exec valgrind --tool=memcheck --leak-resolution=high --leak-check=full --num-callers=25 --suppressions="...valgrind/pyalloc.supp" --suppressions="...valgrind/sage.supp" --suppressions="...valgrind/sage-additional.supp" --log-file=".../valgrind/sage-memcheck.%p" sage-runtests --serial --timeout=172800 --optional=all hello_world.py |
| 1195 | + exec valgrind --tool=memcheck --leak-resolution=high --leak-check=full --num-callers=25 --suppressions="...valgrind/pyalloc.supp" --suppressions="...valgrind/sage.supp" --suppressions="...valgrind/sage-additional.supp" --log-file=.../valgrind/sage-memcheck.%p... sage-runtests --serial --timeout=172800 --optional=all hello_world.py |
1194 | 1196 | """
|
1195 | 1197 | try:
|
1196 | 1198 | sage_cmd = self._assemble_cmd()
|
1197 | 1199 | except ValueError:
|
1198 | 1200 | self.log(sys.exc_info()[1])
|
1199 | 1201 | return 2
|
1200 | 1202 | opt = self.options
|
1201 |
| - if opt.gdb: |
1202 |
| - cmd = '''exec gdb -x "%s" --args '''%(os.path.join(SAGE_VENV, "bin", "sage-gdb-commands")) |
1203 |
| - flags = "" |
1204 |
| - if opt.logfile: |
1205 |
| - sage_cmd += " --logfile %s"%(opt.logfile) |
1206 |
| - else: |
1207 |
| - if opt.logfile is None: |
1208 |
| - default_log = os.path.join(DOT_SAGE, "valgrind") |
1209 |
| - if os.path.exists(default_log): |
1210 |
| - if not os.path.isdir(default_log): |
1211 |
| - self.log("%s must be a directory"%default_log) |
1212 |
| - return 2 |
1213 |
| - else: |
1214 |
| - os.makedirs(default_log) |
1215 |
| - logfile = os.path.join(default_log, "sage-%s") |
1216 |
| - else: |
1217 |
| - logfile = opt.logfile |
1218 |
| - if opt.valgrind: |
1219 |
| - toolname = "memcheck" |
1220 |
| - flags = os.getenv("SAGE_MEMCHECK_FLAGS") |
1221 |
| - if flags is None: |
1222 |
| - flags = "--leak-resolution=high --leak-check=full --num-callers=25 " |
1223 |
| - flags += '''--suppressions="%s" '''%(os.path.join(SAGE_EXTCODE,"valgrind","pyalloc.supp")) |
1224 |
| - flags += '''--suppressions="%s" '''%(os.path.join(SAGE_EXTCODE,"valgrind","sage.supp")) |
1225 |
| - flags += '''--suppressions="%s" '''%(os.path.join(SAGE_EXTCODE,"valgrind","sage-additional.supp")) |
1226 |
| - elif opt.massif: |
1227 |
| - toolname = "massif" |
1228 |
| - flags = os.getenv("SAGE_MASSIF_FLAGS", "--depth=6 ") |
1229 |
| - elif opt.cachegrind: |
1230 |
| - toolname = "cachegrind" |
1231 |
| - flags = os.getenv("SAGE_CACHEGRIND_FLAGS", "") |
1232 |
| - elif opt.omega: |
1233 |
| - toolname = "exp-omega" |
1234 |
| - flags = os.getenv("SAGE_OMEGA_FLAGS", "") |
1235 |
| - cmd = "exec valgrind --tool=%s "%(toolname) |
1236 |
| - flags += ''' --log-file="%s" ''' % logfile |
1237 |
| - if opt.omega: |
1238 |
| - toolname = "omega" |
1239 |
| - if "%s" in flags: |
1240 |
| - flags %= toolname + ".%p" # replace %s with toolname |
1241 |
| - cmd += flags + sage_cmd |
1242 | 1203 |
|
1243 |
| - sys.stdout.flush() |
1244 |
| - sys.stderr.flush() |
1245 |
| - self.log(cmd) |
1246 |
| - |
1247 |
| - if testing: |
1248 |
| - return |
1249 |
| - |
1250 |
| - # Setup signal handlers. |
1251 |
| - # Save crash logs in temporary directory. |
1252 |
| - os.putenv('CYSIGNALS_CRASH_LOGS', tmp_dir("crash_logs_")) |
1253 |
| - init_cysignals() |
| 1204 | + with importlib.resources.path(__package__, 'sage-gdb-commands') as sage_gdb_commands: |
| 1205 | + if opt.gdb: |
| 1206 | + cmd = f'''exec gdb -x {shlex.quote(str(sage_gdb_commands))} --args ''' |
| 1207 | + flags = "" |
| 1208 | + if opt.logfile: |
| 1209 | + sage_cmd += f" --logfile {shlex.quote(opt.logfile)}" |
| 1210 | + else: |
| 1211 | + if opt.logfile is None: |
| 1212 | + default_log = os.path.join(DOT_SAGE, "valgrind") |
| 1213 | + if os.path.exists(default_log): |
| 1214 | + if not os.path.isdir(default_log): |
| 1215 | + self.log(f"{default_log} must be a directory") |
| 1216 | + return 2 |
| 1217 | + else: |
| 1218 | + os.makedirs(default_log) |
| 1219 | + logfile = os.path.join(default_log, "sage-%s") |
| 1220 | + else: |
| 1221 | + logfile = opt.logfile |
| 1222 | + if opt.valgrind: |
| 1223 | + toolname = "memcheck" |
| 1224 | + flags = os.getenv("SAGE_MEMCHECK_FLAGS") |
| 1225 | + if flags is None: |
| 1226 | + flags = "--leak-resolution=high --leak-check=full --num-callers=25 " |
| 1227 | + flags += '''--suppressions="%s" '''%(os.path.join(SAGE_EXTCODE,"valgrind","pyalloc.supp")) |
| 1228 | + flags += '''--suppressions="%s" '''%(os.path.join(SAGE_EXTCODE,"valgrind","sage.supp")) |
| 1229 | + flags += '''--suppressions="%s" '''%(os.path.join(SAGE_EXTCODE,"valgrind","sage-additional.supp")) |
| 1230 | + elif opt.massif: |
| 1231 | + toolname = "massif" |
| 1232 | + flags = os.getenv("SAGE_MASSIF_FLAGS", "--depth=6 ") |
| 1233 | + elif opt.cachegrind: |
| 1234 | + toolname = "cachegrind" |
| 1235 | + flags = os.getenv("SAGE_CACHEGRIND_FLAGS", "") |
| 1236 | + elif opt.omega: |
| 1237 | + toolname = "exp-omega" |
| 1238 | + flags = os.getenv("SAGE_OMEGA_FLAGS", "") |
| 1239 | + cmd = "exec valgrind --tool=%s "%(toolname) |
| 1240 | + flags += f''' --log-file={shlex.quote(logfile)} ''' |
| 1241 | + if opt.omega: |
| 1242 | + toolname = "omega" |
| 1243 | + if "%s" in flags: |
| 1244 | + flags %= toolname + ".%p" # replace %s with toolname |
| 1245 | + cmd += flags + sage_cmd |
| 1246 | + |
| 1247 | + sys.stdout.flush() |
| 1248 | + sys.stderr.flush() |
| 1249 | + self.log(cmd) |
| 1250 | + |
| 1251 | + if testing: |
| 1252 | + return |
| 1253 | + |
| 1254 | + # Setup signal handlers. |
| 1255 | + # Save crash logs in temporary directory. |
| 1256 | + os.putenv('CYSIGNALS_CRASH_LOGS', tmp_dir("crash_logs_")) |
| 1257 | + init_cysignals() |
| 1258 | + |
| 1259 | + import signal |
| 1260 | + import subprocess |
| 1261 | + p = subprocess.Popen(cmd, shell=True) |
1254 | 1262 |
|
1255 |
| - import signal |
1256 |
| - import subprocess |
1257 |
| - p = subprocess.Popen(cmd, shell=True) |
1258 |
| - if opt.timeout > 0: |
1259 |
| - signal.alarm(opt.timeout) |
1260 |
| - try: |
1261 |
| - return p.wait() |
1262 |
| - except AlarmInterrupt: |
1263 |
| - self.log(" Timed out") |
1264 |
| - return 4 |
1265 |
| - except KeyboardInterrupt: |
1266 |
| - self.log(" Interrupted") |
1267 |
| - return 128 |
1268 |
| - finally: |
1269 |
| - signal.alarm(0) |
1270 |
| - if p.returncode is None: |
1271 |
| - p.terminate() |
| 1263 | + if opt.timeout > 0: |
| 1264 | + signal.alarm(opt.timeout) |
| 1265 | + try: |
| 1266 | + return p.wait() |
| 1267 | + except AlarmInterrupt: |
| 1268 | + self.log(" Timed out") |
| 1269 | + return 4 |
| 1270 | + except KeyboardInterrupt: |
| 1271 | + self.log(" Interrupted") |
| 1272 | + return 128 |
| 1273 | + finally: |
| 1274 | + signal.alarm(0) |
| 1275 | + if p.returncode is None: |
| 1276 | + p.terminate() |
1272 | 1277 |
|
1273 | 1278 | def run(self):
|
1274 | 1279 | """
|
|
0 commit comments