This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Better module/symbol tracking for user space


Hi,

I added some code to solve PR11015 Support shared library reloading (in
different processes), which should resolve the "ERROR Reloaded module
'XXX' at 0xYYY, was 0xZZZ" that people were seeing recently. This isn't
really new, we used to just silently ignore this issue in the past.
Which meant we would not track modules/symbols correctly for user space
shared libraries which were loaded at different addresses in different
processes. This patch fixes that:

commit ea549ffc2915aa58861637472b12196222673fa2
Author: Mark Wielaard <mjw@redhat.com>
Date:   Mon Dec 21 13:02:19 2009 +0100

  PR11015 Support shared library reloading (in different processes)
  
  * runtime/task_finder_vma.c (stap_remove_vma_map_info): Return negative
    status on failure.
    (stap_find_vma_map_info): Likewise.
    (stap_find_vma_map_info_user): New function.
    (stap_drop_vma_maps): New function.
  * runtime/sym.h (addr): Renamed to static_addr, to store addresses for
    sections which are always mapped at the same address.
    (_stp_module_relocate): Add extra struct task_struct *tsk argument.
  * runtime/sym.c (_stp_tf_exec_cb): New callback, calls stap_drop_vma_maps.
    (_stp_tf_mmap_cb): Don't store address in module.section, but call
    stap_add_vma_map_info() per tsk->group_leader for matched module.
    Don't register empty/null modules.
    (_stp_module_relocate): Take extra struct task_struct *tsk argument,
    cache last tsk used. Only use section->static_addr for none dynamic
    modules. Use stap_find_vma_map_info_user() to locate dynamic modules.
    (_stp_mod_sec_lookup): Add extra argument unsigned long *rel_addr to
    optionally store relative address when module/section found.
    (_stp_kallsyms_lookup): Use _stp_mod_sec_lookup to find relative address.
    (_stp_sym_init): Register _stp_tf_exec_cb in stap_task_finder_target.
    Add error check to see if task finder could be initialized.
  * dwflpp.cxx (emit_address): Pass NULL for kernel/modules and current for
    user tasks to _stp_module_relocate.
  * runtime/transport/symbols.c (_stp_do_relocation): Set new static_addr
    _stp_section field.
  * runtime/unwind.c (adjustStartLoc): Take new struct task_struct *tsk
    argument and pass to stap_find_vma_map_info_user and _stp_module_relocate
    to find adjusted addr.
    (_stp_search_unwind_hdr): Pass through struct task_struct *tsk.
    (unwind_frame): Likewise.
  * tapset/context-symbols.stp (probemod): Add NULL to _stp_mod_sec_lookup
    call to indicate we aren't interested in relative address.
  * tapsets.cxx (dwarf_derived_probe_group::emit_module_init): Pass NULL to
    _stp_module_relocate to indicate kernel/module address.

I didn't add new test cases yet, so would appreciate if people who saw
the above ERROR could double check things work as expected now. I also
added some XXX comments in runtime/sym.c for things I think we are still
doing which are not 100% correct/optimal yet. Also the unwind.c
(adjustStartLoc) function should really, really be rewritten. I only
fixed it up enough to fit the new structure, but it really shouldn't be
doing all the work it is now doing directly anymore.

Cheers,

Mark


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]