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,6 +941,7 @@ module MiniTest
leakchecker = LeakChecker.new
continuation = proc do
assertions = filtered_test_methods.map { |method|
inst = suite.new method
inst._assertions = 0
@ -961,10 +962,17 @@ module MiniTest
inst._assertions
}
return assertions.size, assertions.inject(0) { |sum, n| sum + n }
end
if ENV["LEAK_CHECKER_TRACE_OBJECT_ALLOCATION"]
require "objspace"
ObjectSpace.trace_object_allocations(&continuation)
else
continuation.call
end
end
##
# Record the result of a single test. Makes it very easy to gather
# information. Eg: