Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Binary instrumentation: more robust exclusion of functions used internally #238

Merged
merged 21 commits into from
Feb 7, 2023

Conversation

jrmadsen
Copy link
Collaborator

@jrmadsen jrmadsen commented Feb 5, 2023

Overview

This PR attempts to increase the stability of binary rewrite and runtime instrumentation.

Improved protection against self-instrumentation

Using the binary analysis capabilities added from #229 the Dyninst SymtabAPI, OmniTrace now does a much better job of avoiding instrumentation of functions which are internally called by OmniTrace:

  • The omnitrace executable searches for and parses the symbols of various libraries which are known to cause problems when instrumented
    • GNU libraries which are common to nearly every library, e.g., "libc.so.6", "libdl.so.2", etc., and thus are outside the scope of the users optimizations efforts
    • Libraries which OmniTrace depends on for functionality, e.g. "libunwind.so", "libgotcha.so", "libroctracer64.so", etc.
      • OmniTrace skips instrumenting any module_function instance when it's member module_name or function_name variable matches the library name, source file, or function name found for that symbol (unless the user explicitly requests that it be eligible for instrumentation)
  • Note: the parsing of the "internal" libraries may result in longer instrumentation time and higher memory usage. Please file an issue if either of these is found to be excessive.

Function filters based on linkage and visibility

Added options to restrict instrumentation to certain linkage types (e.g. avoid instrumenting weak symbols) and visibility types (e.g. avoid instrumenting hidden symbols).

Function filters based on instructions

In the past, after instrumentation, some applications instrumented by Dyninst would fail with a trap signal (e.g. #147). In several cases, it was found that this occurred whenever certain instructions were present in the function so an option was added to exclude functions based on one or more regex patterns was added.

Details

  • generates list of "internal" libraries and attempts to find the first match via:
    • the library is already open, e.g. dlopen(<libname>, RTLD_LAZY | RTLD_NOLOAD)
    • searching for the library in LD_LIBRARY_PATH
    • searching for the library in OMNITRACE_ROCM_PATH, ROCM_PATH
    • searching the folders from /sbin/ldconfig -p
    • searching for the library in common places such as /usr/local/lib
  • provides new --linkage command line option to restrict instrumentation to functions with particular type(s) of linkage
    • Linkage types: unknown, global, local, weak, unique
  • provides new --visibility command line option to restrict instrumentation to functions with particular type(s) of visibility
    • Visibility types: unknown, default, hidden, protected, internal
  • provides new --internal-module-include and --internal-function-include command line regex options to bypass automatic exclusion from instrumentation
  • provides new --internal-library-append command line option to specify a library should be considered internal
  • provides new --internal-library-remove command line option to specify a library should not be considered internal
  • provides new --instruction-exclude command line regex option to exclude functions which contain matching instructions
  • provides new --internal-library-deps command line option to treat libraries linked to internal libraries as internal libraries
    • generally, this will only be helpful during runtime instrumentation when OmniTrace is built with an external dyninst library which is dynamically linked to boost libraries and the application is using the same boost libraries
  • relaxed restrictions in module_function::is_module_constrained()
  • relaxed restrictions in module_function::is_routine_constrained()
  • added a few miscellaneous nullptr checks

Miscellaneous

  • Fix LD_PRELOAD + OMNITRACE_DL_VERBOSE=3 issue
  • Adds a sampling offload verbose message
  • Improves MPI send-recv.cpp example error message
  • Minor tweaks to binary library
    • binary::get_linked_path returns std::optional<string>
    • renamed binary::symbol::read_bfd to binary::symbol::read_bfd_line_info
    • binary::get_binary_info has param options for reading line info and included undefined symbols
  • fixed another edge case instance of resource deadlock during first call to configure_settings
  • improved the error log printing in omnitrace (does not print repeated messages)

- join needs to handle nullptr
- get_linked_path returns std::optional<string>
- get_binary_info accepts include_undef flag
- renamed symbol::read_bfd to symbol::read_bfd_line_info
- get_binary_info has param options for reading line info and included undefined symbols
- fixed another instance of resource deadlock during first call to configure_settings
- disable rocprofiler tests when HIP enabled but OMNITRACE_USE_ROCPROFILER=OFF
- added internal-libs.cpp
- using binary::get_binary_info on various known libs used by omnitrace
- any matching func/file from symbols found in known internal libs are excluded
- relaxed restrictions in is_module_constrained
- relaxed restrictions in is_routine_constrained
- added a few safety checks
- options to change which libs are considered internal libraries
@jrmadsen jrmadsen added libomnitrace-dl Involves omnitrace-dl library omnitrace-instrument Involves the omnitrace-instrument executable (binary instrumenter) binary instrumentation Binary instrumentation sampling Statistical sampling via interrupts testing Extends/improves/modifies testing examples Adds new example or modifies existing example labels Feb 5, 2023
- regex option for excluding functions containing specific instructions
- fix compiler error for Ubuntu Jammy + GCC 12
- dlopen + libtbbmalloc_proxy appears to be causing issues on OpenSUSE
- multithread processing internal info
- report timing info
- wait until after address space is created
- conflicting versions of libraries for binary analysis causes problems
- expanded whole function restrictions
- expanded module_function::is_routine_constrained regex
- include memory usage info
- option to read libraries linked against internal libs: --internal-library-deps
- defer parsing internal libs data to when processing modules
@jrmadsen jrmadsen added libomnitrace Involves omnitrace library libomnitrace-common common "library" used by multiple libraries and removed libomnitrace-dl Involves omnitrace-dl library labels Feb 7, 2023
@jrmadsen jrmadsen added libomnitrace-binary Internal library containing binary analysis capabilities libomnitrace-core Internal library containing core capabilities labels Feb 7, 2023
@jrmadsen jrmadsen merged commit 0da62c9 into ROCm:main Feb 7, 2023
@jrmadsen jrmadsen deleted the omnitrace-exe-exclude-internal-libs branch February 7, 2023 09:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
binary instrumentation Binary instrumentation examples Adds new example or modifies existing example libomnitrace Involves omnitrace library libomnitrace-binary Internal library containing binary analysis capabilities libomnitrace-common common "library" used by multiple libraries libomnitrace-core Internal library containing core capabilities omnitrace-instrument Involves the omnitrace-instrument executable (binary instrumenter) sampling Statistical sampling via interrupts testing Extends/improves/modifies testing
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant