1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

tool/lib/leakchecker.rb: show the code location that allocated leaked fd

by using ObjectSpace.trace_object_allocations.

`make test-all LEAK_CHECKER_TRACE_OBJECT_ALLOCATION=true` will print not
only leaked fds but also where it was created.
This commit is contained in:
Yusuke Endoh 2019-11-12 01:30:42 +09:00
parent b72eda3c59
commit c02de30efb
2 changed files with 29 additions and 16 deletions

View file

@ -75,9 +75,13 @@ class LeakChecker
}
fd_leaked.each {|fd|
str = ''.dup
pos = nil
if h[fd]
str << ' :'
h[fd].map {|io, autoclose, inspect|
if ENV["LEAK_CHECKER_TRACE_OBJECT_ALLOCATION"]
pos = "#{ObjectSpace.allocation_sourcefile(io)}:#{ObjectSpace.allocation_sourceline(io)}"
end
s = ' ' + inspect
s << "(not-autoclose)" if !autoclose
s
@ -86,6 +90,7 @@ class LeakChecker
}
end
puts "Leaked file descriptor: #{test_name}: #{fd}#{str}"
puts " The IO was created at #{pos}" if pos
}
#system("lsof -p #$$") if !fd_leaked.empty?
h.each {|fd, list|

View file

@ -941,28 +941,36 @@ module MiniTest
leakchecker = LeakChecker.new
assertions = filtered_test_methods.map { |method|
inst = suite.new method
inst._assertions = 0
continuation = proc do
assertions = filtered_test_methods.map { |method|
inst = suite.new method
inst._assertions = 0
print "#{suite}##{method} = " if @verbose
print "#{suite}##{method} = " if @verbose
start_time = Time.now if @verbose
result = inst.run self
start_time = Time.now if @verbose
result = inst.run self
print "%.2f s = " % (Time.now - start_time) if @verbose
print result
puts if @verbose
$stdout.flush
print "%.2f s = " % (Time.now - start_time) if @verbose
print result
puts if @verbose
$stdout.flush
unless defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? # compiler process is wrongly considered as leak
leakchecker.check("#{inst.class}\##{inst.__name__}")
end
unless defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? # compiler process is wrongly considered as leak
leakchecker.check("#{inst.class}\##{inst.__name__}")
end
inst._assertions
}
inst._assertions
}
return assertions.size, assertions.inject(0) { |sum, n| sum + n }
end
return assertions.size, assertions.inject(0) { |sum, n| sum + n }
if ENV["LEAK_CHECKER_TRACE_OBJECT_ALLOCATION"]
require "objspace"
ObjectSpace.trace_object_allocations(&continuation)
else
continuation.call
end
end
##