History log of /external/strace/unwind.c
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
73741d2e2ee0f9d446b0dc2fbc70be3f5b10521b 13-Jun-2014 Dmitry V. Levin <ldv@altlinux.org> unwind: ignore memory mappings that have no PROT_EXEC bit set

* unwind.c (build_mmap_cache): For each memory mapping being scanned,
save its PROT_EXEC bit and skip the mapping if it is not set.
/external/strace/unwind.c
9a349c7779c1c0da89b4eb2821c3b5e6de84adcf 12-Jun-2014 Dmitry V. Levin <ldv@altlinux.org> unwind: cleanup build_mmap_cache

* unwind.c (build_mmap_cache): Move local variables to the code branch
where they are used. Check return code of sscanf and strdup. Do not
treat unusual memory mappings as fatal errors. Do not skip memory
mappings with path names starting with "[".
/external/strace/unwind.c
2222b928c65b1259f27625d6e50627865fb75336 13-Jun-2014 Dmitry V. Levin <ldv@altlinux.org> unwind: remove unused field from mmap_cache_t

* unwind.c (mmap_cache_t): Remove "deleted" field.
(build_mmap_cache): Remove initialization of "deleted" field.
/external/strace/unwind.c
52840ede0c72d90b9dad3dc829ef4b4909d51ab6 06-Jun-2014 Dmitry V. Levin <ldv@altlinux.org> unwind: refactor stacktrace_walk

* unwind.c (stacktrace_walk): Move stack frame printing code
to separate function print_stack_frame.
/external/strace/unwind.c
806539c55c8697f7f0a4bfd95345f216797fe7e0 06-Jun-2014 Dmitry V. Levin <ldv@altlinux.org> unwind: constify binary_filename and symbol_name functions arguments

* unwind.c (call_action_fn, print_call_cb, sprint_call_or_error,
queue_put, queue_put_call): Add const qualifier to binary_filename and
symbol_name arguments.
/external/strace/unwind.c
f1d73110a00122879a0fdb63bbeffc0bd161e857 10-Jun-2014 Luca Clementi <luca.clementi@gmail.com> unwind: disable stack trace with multiple personalities

* unwind.c (unwind_cache_invalidate, unwind_print_stacktrace,
unwind_capture_stacktrace): Disable stack tracing of non-default
personality processes.
/external/strace/unwind.c
6555711a6ee9b63a5a9c5e3e530d066306c0760c 05-Jun-2014 Dmitry V. Levin <ldv@altlinux.org> unwind: rename function_off_set to function_offset

* unwind.c (call_action_fn, stacktrace_walk, STACK_ENTRY_SYMBOL_FMT,
print_call_cb, sprint_call_or_error, queue_put, queue_put_call):
Rename function_off_set to function_offset.
/external/strace/unwind.c
c12eb1117c8d91773ea0c138eb220addec1448d0 05-Jun-2014 Dmitry V. Levin <ldv@altlinux.org> unwind: fix a bug in range updating of binary search

* unwind.c (print_stacktrace): Fix another off-by-one error in binary search.
/external/strace/unwind.c
c903c822ee94478bff1732eb80744e201c074d26 05-Jun-2014 Dmitry V. Levin <ldv@altlinux.org> unwind: use fopen64 instead of fopen

* unwind.c (fopen_for_input): Define to fopen64 iff
[_LARGEFILE64_SOURCE && HAVE_FOPEN64], otherwise define it to fopen.
(build_mmap_cache): Use fopen_for_input instead of fopen.
/external/strace/unwind.c
e4113974893293c82f177fe4195cac0a5b70465a 05-Jun-2014 Dmitry V. Levin <ldv@altlinux.org> unwind: fix build on 32-bit architectures

Fix compilation warnings in unwind.c on 32-bit architectures.
On some architectures getuid is actually getuid32, so change the test
to use getpid instead of getuid.

* unwind.c (STACK_ENTRY_SYMBOL_FMT): Explicitly cast function_off_set
to unsigned long.
(queue_put_error): Change the 3rd argument's type to unsigned long.
* tests/stack-fcall.c (f1): Use getpid instead of getuid.
* tests/strace-k.test: Likewise.
/external/strace/unwind.c
a0b4ee7b38e600f28e547585e754b7737b388d90 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: enable dwarf cache of libunwind

Here is the benchmark of the dwarf cache.

Target program:

#include <sched.h>
int main(void)
{
unsigned int max = 0x6fff, i;
for (i = 0; i < max; i++)
sched_yield();
return 0;
}

Command line:

./strace -o /dev/null -k a.out

With the dwarf cache:

real 0m12.081s
user 0m3.858s
sys 0m8.194s

Without the dwarf cache:

real 0m22.326s
user 0m5.218s
sys 0m16.952s

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
/external/strace/unwind.c
b45b7faa1fc0373831fb00a3892de45b4df87232 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: report expected backtracing error

When a file mmap'ed to the target process is unlink'ed, backtracing the
stack would fail. Current implementation reports it as
"backtracing_error". To avoid confusion, the message is changed to
"expected_backtracing_error".

Here is the reproducer:

$ cat ./p-deleted.c
#include <unistd.h>

int main(int argc, char **argv) {
return unlink(argv[0]) < 0;
}

$ strace -e unlink -k ./p-deleted
unlink("./p-deleted") = 0
> /usr/lib64/libc-2.18.so(unlink+0x7) [0xe7f17]
> /home/yamato/var/strace/t_unwind/p-deleted (deleted)(+0x0) [0x575]
> /usr/lib64/libc-2.18.so(__libc_start_main+0xf5) [0x21d65]
> backtracing_error [0x7ffff1365590]
+++ exited with 0 +++

p-deleted is deleted therefore backtracing_error is reported. This
patch records the deleted marker when making mmap cache and refers the
recorded information in the case "backtracing_error" to switch the
message.

Here is the output of this patch:

$ strace -e unlink -k ./p-deleted
unlink("./p-deleted") = 0
> /usr/lib64/libc-2.18.so(unlink+0x7) [0xe7f17]
> /home/yamato/var/strace/t_unwind/p-deleted (deleted)(+0x0) [0x575]
> /usr/lib64/libc-2.18.so(__libc_start_main+0xf5) [0x21d65]
> expected_backtracing_error [0x7ffff1365590]
+++ exited with 0 +++

This solution is not perfect: if a file is unlink'ed after making the
mmap cache and before unwinding, strace cannot have a chance to record
the deleted marker.

In this version of patch, hardcoded magic number used in comparing "(delete)"
string is replaced with strlen as suggested by Dmitry Levin.

In old version of patch, the deleted entry was thrown away from mmap
cache to avoid to report "backtracing_error". In this patch I keep it,
and just switch the error message.
Inspired by the review comment from Dmitry Levin.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
/external/strace/unwind.c
9bc6561588093a788c29f07579f9e4103864a752 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: implement automatic mmap cache invalidation

A mmap cache belonging to a tcb was updated when a system call which
changed the memory mapping was called. This implementation was assumed
the mapping was changed only by the tcb. However, this assumption is
incorrect if the target application is multi-threaded; more than two
tcbs can shared the same memory mapping and a tcb can modify it without
being noticed by the others.

This change introduces a global integer variable mmap_cache_generation,
and mmap_cache_generation field to struct tcb. The variable
is incremented each time a process enters a syscall that can modify its
memory mapping. Each tcb records the value of this variable at the
moment if building its mmap cache. Every mmap cache associated with
the given tcb can be validated by comparing its mmap_cache_generation
field with the variable mmap_cache_generation.

This implementation is inefficient. If strace attaches two processes
which don't share the memory mapping, rebuilding mmap cache of a tcb
triggered by another tcb's mmap system call is not necessary.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
/external/strace/unwind.c
f8e39d7b7a9d581e634be59af73cf82cb566abf9 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: introduce queue_t for capturing stacktrace

This is the second step for splitting capturing from printing.

New `queue' field is added to tcb. Captured stacktrace is stored here.
The field is initialized/finalized at unwind_tcb_init/unwind_tcb_fin.

New API function unwind_capture_stacktrace is added. This function
captures the currest stack using stracktrace_walker and records it in
tcb. It's printing is delayed to the next call of
unwind_print_stacktrace.

unwind_print_stacktrace is extended. Now it checks queue field of
the given tcb at the start of function. If the function finds a
captured stack trace, the latter is printed using stracktrace_walker.

Currently unwind_capture_stacktrace invocations are added directly to
handlers of mmap, munmap, mprotect, and execve.

Here is the difference of output with/without patch:

(without patch)
execve("./test-fork", ["./test-fork"], [/* 56 vars */]) = 0
> /usr/lib64/ld-2.18.so(check_one_fd.part.0+0x82) [0x11f0]

(with patch)
execve("./test-fork", ["./test-fork"], [/* 54 vars */]) = 0
> /usr/lib64/libc-2.18.so(execve+0x7) [0xbcd27]
> /home/yamato/var/strace/strace(exec_or_die+0x10c) [0x26ac]
> /home/yamato/var/strace/strace(startup_child+0x346) [0x134f6]
> /home/yamato/var/strace/strace(init+0x89f) [0x13dff]
> /home/yamato/var/strace/strace(main+0xa) [0x26ca]
> /usr/lib64/libc-2.18.so(__libc_start_main+0xf5) [0x21d65]
> /home/yamato/var/strace/strace(_start+0x29) [0x2799]

In older version output lines of captured elements were built when
printing. In this version they are built when capturing the stack.
As result, unneeded dynamic memory allocations are avoided.
Suggested by Luca Clementi.

In older version the combination of snprintf and realloc were used.
In this version they are replaced with asprintf.
Suggested by Dmitry Levin.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
/external/strace/unwind.c
4e121e5bb45f79ec61dc2c01c7625ccf215d8457 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: introduce own debug macro

* unwind.c (DPRINTF): New macro, to be utilized in debugging cache
management code.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
/external/strace/unwind.c
2d534daaa66ddc6a0558717160f0e1b337f7b7c5 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: introduce stacktrace_walker

In current implementation, the stack trace is captured and printed at
the same time, in trace_syscall_exiting. This approach cannot
provide user expected information when a system call changes the
memory mapping. In such cases, the stack trace should be captured on
entering syscall and printed on exiting.

As the initial step for splitting capturing from printing, this change
introduces stacktrace_walker utility function. It can be used both for
capturing in trace_syscall_entering and printing in
trace_syscall_exiting.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
/external/strace/unwind.c
6141392856a170c9297783e6bfbd9fd970f76fdf 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: give all exported functions "unwind_" prefix

* unwind.c (init_unwind_addr_space): Rename to unwind_init.
(init_libunwind_ui): Rename to unwind_tcb_init.
(free_libunwind_ui): Rename to unwind_tcb_fin.
(delete_mmap_cache): Rename to unwind_cache_invalidate.
(print_stacktrace): Rename to unwind_print_stacktrace.
* defs.h: Update prototypes.
* mem.c: All callers updated.
* process.c: Likewise.
* strace.c: Likewise.
* syscall.c: Likewise.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
/external/strace/unwind.c
7721499fc7ea15cbf2f7d4f89c9502e325b451fc 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: delete mmap cache in free_libunwind_ui

free_libunwind_ui is expected to release all unwind related resources
attached to tcp.

* strace.c (droptcb): Move delete_mmap_cache call ...
* unwind.c (free_libunwind_ui): ... to here.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
/external/strace/unwind.c
b65042fbdb576d13e9bb57c21a890539cab25c43 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: make alloc_mmap_cache function local

* defs.h (alloc_mmap_cache): Remove.
* unwind.c (alloc_mmap_cache): Add static qualifier.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
/external/strace/unwind.c
b4a2de8efff1aaf45e9bc64fc731213a01cbdb53 16-Apr-2014 Masatake YAMATO <yamato@redhat.com> unwind: fix a bug in range updating of binary search

* unwind.c (print_stacktrace): Fix off-by-one error in binary search.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
Signed-off-by: Luca Clementi <luca.clementi@gmail.com>
/external/strace/unwind.c
327064b63722a4400058e0e7e9b39d9e34b14b57 23-Jul-2013 Luca Clementi <luca.clementi@gmail.com> Add -k option to print stack trace after each syscall

Print the stack trace of the traced process after each system call when
-k option is specified. It is implemented using libunwind to unwind the
stack and to obtain the function name pointed by the IP.

Based on the code that was originally taken from strace-plus
of Philip J. Guo.

* configure.ac: Add --with-libunwind option. Check libunwind support.
* Makefile.am: Add libunwind support.
* defs.h (struct tcb) [USE_LIBUNWIND]: Append libunwind specific fields.
[USE_LIBUNWIND] (stack_trace_enabled, alloc_mmap_cache,
delete_mmap_cache, print_stacktrace): New prototypes.
* mem.c (print_mmap, sys_munmap, sys_mprotect): Add libunwind support.
* process.c (sys_execve): Likewise.
* strace.c (usage, alloctcb, droptcb, init): Likewise.
* syscall.c (trace_syscall_exiting): Likewise.
* unwind.c: New file.
* strace.1: Document -k option.
/external/strace/unwind.c