Я пытаюсь корректно обработать условие, когда запрашивается слишком много памяти трассировки, что приводит к сбою выделения памяти. Вот мой скрипт на python, который был извлечен из основного скрипта и сводится только к этой проблеме (20-секундный сон просто для того, чтобы я мог наблюдать за выделением памяти и свободными шагами с помощью free -m
):
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
from __future__ import print_function
from datetime import datetime
import subprocess
import os
import time
import re
import site
import signal
import sys
import getopt
import Gnuplot
from numpy import *
from decimal import *
def set_trace_buffer_size():
""" Set trace buffer size """
try:
open('/sys/kernel/debug/tracing/buffer_size_kb'
, 'w').write(memory)
print('path is via the non-exception route ')
except:
print('IO error setting trace buffer size ')
sys.exit(2)
def free_trace_buffer():
""" Free the trace buffer memory """
try:
open('/sys/kernel/debug/tracing/buffer_size_kb'
, 'w').write("1")
except:
print('IO error freeing the trace buffer memory ')
sys.exit(2)
def signal_handler(signal, frame):
print(' SIGINT: Forcing cleanup before exit.')
# Free the memory
free_trace_buffer()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
memory = "2500000"
set_trace_buffer_size()
print('Sleeping for 20 seconds')
time.sleep(int(20))
free_trace_buffer()
И я получаю это:
$ sudo ./test.py
close failed in file object destructor:
IOError: [Errno 12] Cannot allocate memory
path is via the non-exception route
Sleeping for 20 seconds
^C SIGINT: Forcing cleanup before exit.
У меня вопрос: что я делаю неправильно, и как я могу получить его, используя путь except
в случае неудачного размещения?
Полагаю, я всегда мог проверить значение после возврата, чтобы узнать, запрашивалось ли оно. При неудаче он, кажется, возвращается к предыдущему значению.