You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.8 KiB
65 lines
1.8 KiB
require 'set' |
|
|
|
LIBRUBY_SO = 'libruby.so' |
|
PROBES_D = 'probes.d' |
|
|
|
# These probes are excluded by VM_COLLECT_USAGE_DETAILS ifdef. |
|
EXCLUDE_PROBES = Set.new %w(insn insn__operand) |
|
|
|
## Detect SystemTap section headers presence |
|
|
|
stap_headers = [ |
|
'\.stapsdt\.base', |
|
'\.note\.stapsdt' |
|
] |
|
|
|
header_regexp = %r{ (#{stap_headers.join('|')}) } |
|
|
|
section_headers = `readelf -S "#{LIBRUBY_SO}"` |
|
detected_stap_headers = section_headers.scan(header_regexp).flatten |
|
|
|
# Assume there are both headers until this is proven wrong ;) |
|
unless detected_stap_headers.size == 2 |
|
puts 'ERROR: SystemTap (DTrace) headers were not detected in resulting library.' |
|
exit false |
|
end |
|
|
|
## Find if every declared probe is propagated to resulting library |
|
|
|
# Colect probes specified in probes.d file. |
|
probes_declared = [] |
|
|
|
File.open(PROBES_D) do |file| |
|
file.each_line do |line| |
|
if probe = line[/probe (\S+)\(.*\);/, 1] |
|
probes_declared << probe |
|
end |
|
end |
|
end |
|
|
|
probes_declared = Set.new probes_declared |
|
|
|
unless EXCLUDE_PROBES.subset? probes_declared |
|
puts 'ERROR: Change in SystemTap (DTrace) probes definition file detected.' |
|
exit false |
|
end |
|
|
|
probes_declared -= EXCLUDE_PROBES |
|
|
|
# Detect probes in resulting library. |
|
get_probes_detected = %r{ |
|
^\s*Provider:\s+ruby,\s+Name:\s+(\S+),\s+.*$ |
|
} |
|
|
|
probes_detected = `eu-readelf -n "#{LIBRUBY_SO}"` |
|
|
|
probes_detected = Set.new probes_detected.scan(get_probes_detected).flatten |
|
|
|
# Both sets must be equal, otherwise something is wrong. |
|
unless probes_declared == probes_detected |
|
puts 'ERROR: SystemTap (DTrace) probes were not correctly propagated into resulting library.' |
|
puts " Undetected probes: #{(probes_declared - probes_detected).sort.join(', ')}\n", |
|
" Additional detected probes: #{(probes_detected - probes_declared).sort.join(', ')}" |
|
|
|
exit false |
|
end
|
|
|