[PATCH 01/25] ldv/unwind: improve stacktrace feature(v3)

Dmitry V. Levin ldv at altlinux.org
Thu Apr 10 22:58:15 UTC 2014


On Sun, Nov 10, 2013 at 03:41:57PM +0900, Masatake YAMATO wrote:
> Based on the discussion on strace-devel, I improved following points:

Masatake, your patch contains several different changes and therefore is
not easy to follow.  This is probably the reason why I failed to review it
in November.  Please submit each logically separate change in a separate
commit.

> * use unwind_ as prefix for functions exported from unwind.c(v1)

The rename itself is fine, but the way how it's implemented is not.
init_unwind_addr_space was renamed to unwind_init by creating a new
function unwind_init which only purpose is to call init_unwind_addr_space.
I wonder why not simply rename init_unwind_addr_space -> unwind_init.
In the similar way, init_libunwind_ui was "renamed" to unwind_tcb_init,
free_libunwind_ui to unwind_tcb_fin.

Also, your patch adds two trivial static functions (stacktrace_capture and
stacktrace_print) that just call stacktrace_walk.  These functions are not
callbacks, so why don't you call stacktrace_walk directly?

> * capture stacktrace of (_exit, exit_group and execve) at entering stage(v1, v3)
> 
>     About the most of system calls, stacktrace is captured and printed at
>     the same time, the system call exiting.  However, this procedure makes
>     unwanted result for some system calls.
> 
>     About execve, which is marked with STACKTRACE_CAPTURE_IN_ENTERING(CE),
>     stacktrace is captured at the system call entering, and is printed at
>     the exiting. By capturing in the system call entering, user can know
>     the process context of execve being called(v1).

I'd rather name it STACKTRACE_CAPTURE_ON_ENTER (with shortcut name SE).

>     It is the same for _exit and exit_group. However, the timing of
>     printing is different from execve: printing when associated tcb
>     object(tcp) is dropped because there is no exiting stage for them(v3).

1. Why do you call unwind_stacktrace_capture when hide_log_until_execve is set?
2. Is it safe to print stack trace from droptcb?

Also, I suppose you can rearrange the code you add to
trace_syscall_entering so that unwind_cache_invalidate would be mentioned
there only once.

>     struct queue_t and some manipulators are introduced for
>     capturing-at-entering and printing-at-exiting.

One of them is mmap_cache_generation that used to implement lazy cache
invalidation: when unwind_cache_invalidate is called, no cache is
deallocated, instead all allocated cache becomes invalid.  Why this
approach is better than direct cache deallocation?

> * control the maps cache with STACKTRACE_MAKE_CACHE_INVALID(CI) marker(v1)
> 
>     Currently stacktrace feature of strace needs the information of the
>     memory mapping. Some of system calls like mmap change the memory
>     mapping of the target process. Therefore unwind.c must track the
>     modification of memory mapping.
> 
>     In older version the modification is tracked in print functions of
>     each system call. In this patch STACKTRACE_MAKE_CACHE_INVALID(CI)
>     marker is introduced. In stead of handling in print functions, the
>     modification is tracked in system call entering only if current
>     system call is marked with CI.

I'd rather name it STACKTRACE_INVALIDATE_CACHE (with shortcut name SI).

>     If new system call modifying the memory mapping is added, just
>     mark it with CI.
> 
> * mark CI on brk, mremap, shmat, shmdt, and remap_file_pages(v1)
> 
> * separate arch dependent CI/CE marking code to different patches(v2)

You made ~25 patches to implement this, one per architecture, but
reviewing it would be a herculean task.  I suppose you made this change
using a simple script.  Adding this script to the commit message would
help reviewer a lot.

> * simplify call_t data structure(v3)
> 
>     In older version output lines of captured elements are built when
>     printing. In this version they are built when capturing the stack.
>     As the result dynamic memory allocations are suppressed.
>     Suggested by Luca Clementi <luca.clementi at gmail.com>.

Your patch adds a function called sprint_call_or_error.  What it
essentially does is a asprintf(3) emulation using a realloc-snprintf loop.
Why don't you call asprintf directly?

> * handle multiple threads(v3)
> 
>     Rebuild caches for mmaps of all target threads if a thread invokes
>     CI makred syscalls. This is inefficient; whether an address space
>     is shared or not between the threads is not considered.
> 
> TODO:
> 
> * move the memory mapping cache to libuwind and use API for it
> 
>     See http://lists.nongnu.org/archive/html/libunwind-devel/2013-10/msg00001.html

Is there any progress with this idea?


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20140411/2f5bc5a6/attachment.bin>


More information about the Strace-devel mailing list