blob: 16148733c19f8a0fd5c202363d4bba3414048ee9 [file] [log] [blame]
* Version 0.8.0
** Prototype libraries
- Each DSO can now ship an ltrace config file (called prototype
library) that ltrace will open when that DSO is loaded to process
image. See ltrace(1) for details.
- ltrace.conf is no longer part of installation tarball. Instead,
we now ship,,, and
syscalls.conf. Those are now istalled to /usr/share/ltrace by
default. /etc/ltrace.conf and $HOME/.ltrace.conf are still
loaded if present, and can contain arbitrary user configuration.
- The option -F was retrofitted to be a colon-separated list of
prototype libraries, and directories to look for prototype
libraries in. On Linux, ltrace looks into XDG_CONFIG_HOME,
XDG_CONFIG_DIRS, and /usr/share/ltrace as well.
- Wide character strings are supported in prototypes. Use "string"
lens as usual, but use array of integers as underlying type. now contains prototypes of wide character functions.
- Sole void function parameter such as in the following example, is
now considered obsolete:
| int fork(void); |
This use is still accepted, taken to mean "hide(int)", but
produces a warning, and will be removed in future.
** Architectural support
- MIPS and MIPSel are now handled by the same backend.
- ARMv6, ARMv7 and ARMv8 (AArch64) are supported, including full
fetch backend. ARMv8 backend doesn't support tracing of 32-bit
binaries, as currently there's no 32-bit userspace available for
ARM64 processors.
- Imagination Technologies Meta is now supported.
- On Linux, tracing of IFUNC symbols is supported. On i386,
x86_64, ppc32 with secure PLT and ppc64, IRELATIVE PLT slots are
traced as well.
** -w output now shows full library path
The output format is similar to glibc's backtrace_symbols, e.g.:
> /bin/ls(_init+0x19be) [0x40398e]
> /lib/x86_64-linux-gnu/ [0x7f50cbc3676d]
> /bin/ls(_init+0x25fd) [0x4045cd]
* Version 0.7.3 [2013-09-15 Sun]
** Bugfixes
*** [MIPS] Fix build on mips big endian
This bug caused messages like:
| Making all in mips
| /bin/sh: line 17: cd: mips: No such file or directory
*** [MIPS] Fix SIGSEGV on mips big endian
This bug caused runtime messages like:
| [0x4000000] --- SIGSEGV (Segmentation fault) ---
| [0xffffffff] +++ killed by SIGSEGV +++
*** Fix build with CLANG on FREEBSD
* Version 0.7.2 [2012-12-07 Fri]
** Bugfixes
*** (Again) detect VDSO entry in r_debug linkmap with non-empty name
This bug caused messages like:
| Couldn't determine base address of
| Couldn't load ELF object No such file or directory
*** Fix building with libunwind 1.1
*** Fix prototype lookup for -x symbols from shared libraries
Ltrace was unable to find prototypes of static symbols in shared
libraries. It changed the symbol name internally to the form Thus mangled, symbols were not found in config
* Version 0.7.1 [2012-11-29 Thu]
** Bugfixes
*** ltrace.conf.5 is now installed to man5 as it should be
*** [PowerPC] A header file necessary for building is now shipped
*** [MIPS] Work around duplicate symbol request bug
This fixes the ltrace abort:
| ./ltrace: proc.c: 755: breakpoint_for_symbol: Assertion `bp->libsym == ((void *)0)' failed.
*** Detect VDSO entry in r_debug linkmap with non-empty name
This bug caused messages like:
| Couldn't determine base address of
| Couldn't load ELF object No such file or directory
*** Temporary files are wiped properly after the test suite has been run
*** Parsing typedefs with common prefix now works as it should
More exactly, if there were typedefs X and XY (in this order), and
a reference was made to X, ltrace would match XY instead.
** Cofiguration Files
*** The following prototypes in ltrace.conf were added or updated
__ctype_get_mb_cur_max, __endmntent, __getmntent_r, __setmntent,
a64l, abort, abs, addmntent, getmntent_r, hasmntopt, inet_addr,
inet_aton, inet_lnaof, inet_makeaddr, inet_netof, inet_network,
inet_ntoa, kill, l64a, labs, memcpy, memmove, setlocale,
sigaction, sigaddset, sigandset, sigdelset, sigemptyset,
sigfillset, sigisemptyset, sigismember, signal, sigorset,
sigpending, sigprocmask, sigsuspend.
*** Duplicate typedefs are now guarded against
*** It's now possible to define recursive structures
Please read ltrace.conf(5) man page, chapter "recursive
structures", to learn about this new feature.
*** New lens "bitvec" is available
This allows displaying various data types as bit vectors. Please
read ltrace.conf(5) to learn more.
*** Octal lens renamed to "oct"
For reasons of consistency with "hex". "octal" is still valid and
will be for forseeable future.
*** The hex lens can now format floating point arguments
* Version 0.7.0 [2012-11-09 Fri]
** Tracing
*** Full support for tracing multi-threaded processes
Ltrace now understands thread groups, and it stops all threads
before manipulating breakpoints. The downside is that performance
of multi-threaded processes is rather bad, because handling any
event implies stopping the whole job. The upside is that
individual threads don't get random SIGILL's and SIGSEGV's and
events are not missed.
*** Support for tracing inter-library calls
-e and -x were extended to allow library selectors. See the man
page for details.
*** Better support for parameter passing ("fetch backend")
This version brings more complete support for parameter passing,
including passing structures in registers, passing double on i386,
and other edge cases that were not handled correctly before. The
following architectures now have implementation of fetch backend:
i386, x86_64, ppc, ppc64, ia64, s390, s390x, m68k.
*** Awareness of deny_ptrace SELinux boolean
The deny_ptrace boolean denies all processes from being able to
use ptrace to manipulate other processes. Ltrace now understands
that this boolean exists, and recommends turning it off, if it is
on and ltrace fails to attach to a process.
*** Limited support for tracing returns from tail call functions
*** -e, -x and -l selectors now allow using globs and regular expressions
See the man page for details of the selector syntax. This changes
the way -x and -l behave with respect to tracing libraries opened
by dlopen:
- In 0.6.0, only those -x symbols that were unmatched in main
binary were used to search through symbol table of libraries
opened with dlopen. In 0.7.0, -x and -e are applied uniformly
to each mapped binary: the main binary, dependent DSO's, and any
dlopened libraries.
- In 0.6.0, -l argument was a filename to open and inspect. In
0.7.0, -l is a glob expression matched against each mapped
*** -g command line option dropped
This option was introduced in 0.6.0 with the meaning identical to
-L, which should be used instead.
*** Test suite can now be run under valgrind
Use --enable-valgrind to turn this on.
*** [ppc] Support both BSS and secure PLTs for 32-bit processes
*** [mips] Implement software singlestepping
*** [mips] Add support for CPIC main programs
*** Support tracing PIE binaries
** Configuration Files
*** New abstraction: parameter pack
Parameter packs describe zero or more of actual arguments, whose
type can be determined in runtime. The only parameter pack
currently implemented is "format" for decoding printf-style format
In future, it should be relatively straightforward to add more
parameter packs for functions like execl, and others.
*** New expression: zero
When used in array length expressions, it means "this array ends
at the first element with zero value". C strings are essentially
array(char, zero)*.
*** Lenses: change the way that underlying type is rendered
Lenses are used similarly to parametrized types, e.g.:
| void func(lens(int)); |
**** octal
"octal", which used to be a separate type, is now lens, which can
be used to render any underlying type in base 8. Plain "octal"
is still valid and means the same thing as "octal(int)".
**** hex, hide, bool
Similarly, "hex" lens was introduced to format as base 16.
"hide" was introduced to conceal given argument. "bool" lens was
added to format objects as either true, or false.
**** enum
"enum" became lens as well. Because enum already uses
parentheses to denote the list of enumeration values, the
underlying type is selected by square brackets:
| void func(enum[short](RED,GREEN,BLUE)); |
**** string
"string" was also turned to lens. The argument can be either a
char*, or pointer to array of char, or array of char. The latter
is useful in cases like the following:
| void func_struct_2(struct(string(array(char, 6)))); |
*** Misspelling of "int" as "itn" temporarily accepted, but deprecated
Pre-0.7 ltrace shipped a buggy version of ltrace.conf that
contained the following prototype:
| itn acl_valid(addr); |
To support extant versions of ltrace.conf, that use is now
considered valid, and "itn" is a synonym of "int". It is however
deprecated, and will produce a warning in future.
*** Using void as top-level function argument now deprecated
Functions that take no arguments shouldn't pretend to take one
parameter of void type. For example the following:
| int fork(void); |
... should be declared like this:
| int fork(); |
To support extant versions of ltrace.conf, that use is now
considered valid. It is however deprecated, and will produce a
warning in future.
*** Using void to hide one argument is now obsolete
Ltrace needs to know the exact underlying type to decide what the
calling convention is. The use of void to mean "hide this
argument", such as the following example, is therefore obsolete:
| void func(void, array(int, arg1)); |
Instead, rewrite the prototype depending on the exact underlying
| void func(hide(int), array(int, arg1)); |
| void func(hide(long), array(int, arg1)); |
To support extant versions of ltrace.conf, this use is still
accepted, and "void" is taken to mean "hide(int)". It is however
obsolete, produces a warning, and will be removed in future.
** Documentation
*** New manual page ltrace.conf(5)
*** README, INSTALL brought up to date
*** New file CREDITS with a list of contributors
** Bugfixes
*** Fix detaching from a process
Earlier, a process that ltrace detached from would sometimes die
of SIGSEGV, SIGTRAP, or SIGILL. These were caused by ltrace
detaching from the process just after that process hit a
breakpoint. Program counter would thus be left pointing
mid-instruction, or signals would be left pending.
*** Argument to -n is now checked for validity
*** Fix tracing across exec in a stripped binary
*** [x86] ORIG_RAX/ORIG_EAX may not contain original syscall number
In cases where the system call shouldn't be restarted, these are
set to -1. In that case assume that the return is from the
topmost syscall. This gets rid of some "unexpected breakpoint"
messages on x86_64 and i386.
*** [ppc] Fix races in tracing -e events in 64-bit processes
On ppc, the contents of PLT table change after the first call.
Ltrace used to handle this by reinserting the (now overwritten)
breakpoint after the function returns. This introduced a window
where calls to the same function from the same binary (either a
recursive calls, or calls from another thread) weren't traced.
This is fixed as of 0.7.0.
As a side effect, events requested via -e now only hit when a PLT
call is made, which is consistent with other architectures.
*** [ppc] Allow stepping over lwarx instruction
** Known bugs
*** [arm] Tracing is not supported at all on ARM
ltrace might work on older kernels, but no attempt was made to
fully support it. Newer kernels don't support PTRACE_SINGLESTEP,
which ltrace depends on. Before singlestepping is implemented in
software, ARM is considered unsupported.
* Version 0.6.0 [2011-01-06 Thu]
** General Features
*** Use autotools for building
*** New option -b: disables output of signals received by the tracee
*** New option -w: print stack trace of events
Pass --with-libunwind to configure to enable the feature. This
requires libunwind.
*** Support tracing of symbols from libraries opened with dlopen
These symbols are selected by -x.
** Architecture-specific Changes
*** Various fixes for MIPS and PowerPC
*** Support for ARM Thumb mode
*** Implement fetching of 5th and further function arguments on s390
*** Support fork/exec syscalls on 31-bit s390
*** Support for float and double arguments on x86_64
*** Fixes for return arguments (after '+') in nested calls on x86_64
* License
Copyright (C) 2012-2014 Petr Machata <>
This file is part of ltrace.
ltrace is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
ltrace is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <>.