class RubyMemcheck::Configuration

Constants

DEFAULT_SKIPPED_RUBY_FUNCTIONS
DEFAULT_VALGRIND
DEFAULT_VALGRIND_OPTIONS
DEFAULT_VALGRIND_SUPPRESSIONS_DIR

Attributes

binary_name[R]
output_io[R]
ruby[R]
skipped_ruby_functions[R]
valgrind[R]
valgrind_generate_suppressions[R]
valgrind_generate_suppressions?[R]
valgrind_options[R]
valgrind_suppressions_dir[R]
valgrind_xml_dir[R]

Public Class Methods

new( binary_name:, ruby: FileUtils::RUBY, valgrind: DEFAULT_VALGRIND, valgrind_options: DEFAULT_VALGRIND_OPTIONS, valgrind_suppressions_dir: DEFAULT_VALGRIND_SUPPRESSIONS_DIR, valgrind_generate_suppressions: false, skipped_ruby_functions: DEFAULT_SKIPPED_RUBY_FUNCTIONS, valgrind_xml_dir: Dir.mktmpdir, output_io: $stderr ) click to toggle source
# File lib/ruby_memcheck/configuration.rb, line 38
def initialize(
  binary_name:,
  ruby: FileUtils::RUBY,
  valgrind: DEFAULT_VALGRIND,
  valgrind_options: DEFAULT_VALGRIND_OPTIONS,
  valgrind_suppressions_dir: DEFAULT_VALGRIND_SUPPRESSIONS_DIR,
  valgrind_generate_suppressions: false,
  skipped_ruby_functions: DEFAULT_SKIPPED_RUBY_FUNCTIONS,
  valgrind_xml_dir: Dir.mktmpdir,
  output_io: $stderr
)
  @binary_name = binary_name
  @ruby = ruby
  @valgrind = valgrind
  @valgrind_options = valgrind_options
  @valgrind_suppressions_dir = File.expand_path(valgrind_suppressions_dir)
  @valgrind_generate_suppressions = valgrind_generate_suppressions
  @skipped_ruby_functions = skipped_ruby_functions
  @output_io = output_io

  if valgrind_xml_dir
    valgrind_xml_dir = File.expand_path(valgrind_xml_dir)
    FileUtils.mkdir_p(valgrind_xml_dir)
    @valgrind_xml_dir = valgrind_xml_dir
    @valgrind_options += [
      "--xml=yes",
      # %p will be replaced with the PID
      # This prevents forking and shelling out from generating a corrupted XML
      # See --log-file from https://valgrind.org/docs/manual/manual-core.html
      "--xml-file=#{File.join(valgrind_xml_dir, "%p.out")}",
    ]
  end
end

Public Instance Methods

command(*args) click to toggle source
# File lib/ruby_memcheck/configuration.rb, line 72
def command(*args)
  [
    # On some Rubies, not setting the stack size to be ulimited causes
    # Valgrind to report the following error:
    #   Invalid write of size 1
    #     reserve_stack (thread_pthread.c:845)
    #     ruby_init_stack (thread_pthread.c:871)
    #     main (main.c:48)
    "ulimit -s unlimited && ",
    valgrind,
    valgrind_options,
    get_valgrind_suppression_files(valgrind_suppressions_dir).map { |f| "--suppressions=#{f}" },
    valgrind_generate_suppressions ? "--gen-suppressions=all" : "",
    ruby,
    args,
  ].flatten.join(" ")
end

Private Instance Methods

get_valgrind_suppression_files(dir) click to toggle source
# File lib/ruby_memcheck/configuration.rb, line 92
def get_valgrind_suppression_files(dir)
  full_ruby_version = "#{RUBY_ENGINE}-#{RUBY_VERSION}.#{RUBY_PATCHLEVEL}"
  versions = [full_ruby_version]
  (0..3).reverse_each { |i| versions << full_ruby_version.split(".")[0, i].join(".") }
  versions << RUBY_ENGINE

  versions.map do |version|
    Dir[File.join(dir, "#{binary_name}_#{version}.supp")]
  end.flatten
end