2014-09-09 2 views
4

Некоторые драгоценные камни в моих наборах тестов $stdout до dev/null. Есть ли способ повысить ошибку при изменении $stdout? Или есть какой-то другой способ отслеживать, что его изменяет?Ruby: найти, где глобальная переменная изменена

Обновление: для всех, у кого может быть аналогичная проблема - проблема заключалась в том, что quietly и silence_stream методы ActiveSupport не являются потокобезопасными. В этом случае activerecord-session_store является мешающий камень, см https://github.com/rails/activerecord-session_store/pull/22

ответ

5
set_trace_func proc { |event, file, line, id, binding, classname| 
    if $stdout != STDOUT 
    STDOUT.puts "$stdout changed at #{file}:#{line}" 
    exit 
    end 
} 

Хм. Я предполагаю, что это будет фактически строка после изменения, технически ... Если вам все равно, вы можете вспомнить предыдущий файл/строку на каждом этапе трассировки и напечатать это вместо этого.

+1

Я не уверен, что получал правильный файл или строку в любом случае, но caller_locations помог отследить метод оскорбления. Благодаря! –