Noteworthy changes in release 4.23 (2018-06-14)
===============================================

* Changes in behaviour
  * On x32 personality, 64-bit syscalls (such as readv) are now shown with "#64"
    suffix instead of "64:" prefix.  Unlike the old names, these new names
    can be used in syscall qualification expressions.
  * Changed error number output format: error numbers are consistently
    printed as "-1 ECONST (Error description)"
    for known errors and as "-1 (errno 123)" for unknown errors,
    regardless of -e raw qualification settings.  One can specify
    -X raw for displaying raw error numbers unconditionally.
  * Unfetchable addresses inside arrays are now printed as comments.
  * Obsolete IA-32 mode syscall names are no longer printed on ia64.

* Improvements
  * Implemented libdw backend for -k option, configured at build time
    using --with-libdw option.
    Whether -k option is compiled is now configured at build time
    using --enable-stacktrace option.
  * Added -X option for configuring xlat output formatting (addresses
    Debian bug #692915).
  * Added support for personality designation ("64", "32", or "x32") to syscall
    qualifications in -e trace expressions.
  * Implemented injection of syscalls with no side effects as an alternative
    to injection of an invalid syscall (-e inject=SET:syscall= expression).
  * Improved support for reproducible builds (addresses Debian bug #896016).
  * Implemented decoding of BPF_PROG_QUERY and BPF_RAW_TRACEPOINT_OPEN bpf
    syscall commands.
  * Implemented decoding of INOTIFY_IOC_SETNEXTWD and PERF_EVENT_IOC_* ioctl
    commands.
  * Implemented decoding of PR_GET_SPECULATION_CTRL and PR_SET_SPECULATION_CTRL
    prctl syscall options.
  * Enhanced decoding of bpf, getsockopt, setsockopt, and socket syscalls.
  * Enhanced decoding of NETLINK_KOBJECT_UEVENT and NETLINK_ROUTE protocols.
  * Enhanced decoding of *_DIAG_MEMINFO netlink attributes.
  * Enhanced decoding of BTRFS_*, FS_IOC_*, SIOCGIFHWADDR, and SIOCSIFHWADDR
    ioctl commands.
  * Enhanced decoding of AF_BLUETOOTH socket addresses.
  * Implemented decoding of io_pgetevent syscall.
  * Wired up rseq syscall.
  * Updated lists of ADJ_*, BPF_*, BPF_F_*, BPF_PROG_TYPE_*, ETH_P_*, FPE_*,
    IFF_*, IPPROTO_*, MAP_*, MS_*, MSG_*, NETLINK_*, PACKET_*, PROT_*, SCTP_*,
    SECCOMP_FILTER_FLAG_*, SEGV_*, SEM_*, SHM_*, SW_*, V4L2_CID_*,
    V4L2_CTRL_CLASS_*, and V4L2_PIX_FMT_* constants.
  * Updated lists of ioctl commands from Linux 4.17.

* Bug fixes
  * Fixed decoding of msgtyp argument of msgrcv syscall.
  * Fixed fallback definitions for F_*, MCL_*, MSG_ZEROCOPY, SI_*,
    and SOL_SOCKET constants.
  * Fixed -e trace=%pure expression on mips.

Noteworthy changes in release 4.22 (2018-04-05)
===============================================

* Changes in infrastructure
  * The mailing list was moved to strace-devel@lists.strace.io.
  * SourceForge git repository
    (https://sourceforge.net/p/strace/code/ci/master/tree/) is no longer
    maintained.  Please use GitLab (https://gitlab.com/strace/strace/)
    or GitHub (https://github.com/strace/strace/) repository instead.

* Changes in behaviour
  * When printing string data, '8' and '9' following an octal escape sequence
    no longer lead to unabbreviated octal escape sequence output, as they used
    to do.
  * Angle brackets are now printed as octal number escape sequences
    in the output of paths associated with file descriptors.
  * Data dump for write syscalls (-e write) is performed regardless
    of successfulness of these syscall (addresses Debian bug #436284).
  * -r and -t options are now affect output independently.  Previously,
    -r option led to ignoring of the -t option (addresses Debian bug #466195).

* Improvements
  * Implemented delay injection (-e inject=SET:delay_enter= and
    -e inject=SET:delay_exit= options).
  * Added -A option for opening output files in append mode
    (addresses Debian bug #528488).
  * IPv6 addresses shown in socket information in -yy mode are now printed
    in brackets.
  * Enhanced decoding of bpf, prctl and ptrace syscalls.
  * Enhanced decoding of BTRFS_IOC_INO_PATHS, BTRFS_IOC_LOGICAL_INO, and PTP_*
    ioctl commands.
  * Enhanced NETLINK_ROUTE protocol decoding.
  * Updated lists of signal codes.
  * Updated lists of BPF_*, BTN_*, ETH_P_*, INET_DIAG_BC_*, KEY_*, POLL*, RWF_*,
    SCHED_FLAG_*, SCTP_* and error constants.
  * Implemented block/character device number printing in -yy mode.
  * Known pixel/SDR format names are printed as comments for pixelformat fields
    in v4l2 structures.
  * Enhanced decoding of kern_features syscall.
  * Enhanced NETLINK_NETFILTER netlink protocol decoder.
  * Optimized handling of large number of tracees.
  * Improved wall clock time measurement in syscall count statistics
    (-c -w option).
  * Extended the range of allowed values in -e inject=...:retval= expression.
  * Added i18n support.
  * Updated lists of ioctl commands from Linux 4.16.
  * Enhanced manual page.

* Bug fixes
  * Fixed build on m68k.
  * Fixed v4l2 pixelformat decoding on big-endian architectures.
  * Fixed -O option.

Noteworthy changes in release 4.21 (2018-02-13)
===============================================

* Changes in behaviour
  * Warning is now issued when -F option is used.
  * Warning is now issued when a tracee with unsupported personality
    is attached.
  * Unknown syscall numbers are now printed in hexadecimal form.

* Improvements
  * Implemented decoding of netlink descriptor attributes as file descriptors.
  * Implemented decoding of hugetlb page size selection flags.
  * Implemented decoding of BPF_PROG_TEST_RUN, BPF_PROG_GET_NEXT_ID,
    BPF_MAP_GET_NEXT_ID, BPF_PROG_GET_FD_BY_ID, BPF_MAP_GET_FD_BY_ID,
    and BPF_OBJ_GET_INFO_BY_FD commands of bpf syscall.
  * Enhanced decoding of get_thread_area, memfd_create, modify_ldt,
    perf_event_open, reboot, s390_guarded_storage, s390_pcio_mmio_read,
    s390_pci_mmio_write, s390_runtime_instr, s390_sthyi, set_thread_area,
    and shmget syscalls.
  * Implemented decoding of KVM_* and DM_LIST_DEVICES ioctl commands.
  * Implemented decoding of riscv_flush_icache syscall.
  * Enhanced decoding of getsockopt and setsockopt syscalls for SOL_NETLINK
    level.
  * Enhanced decoding of BPF_MAP_CREATE command of bpf syscall.
  * Print values returned by mq_open syscall and first arguments
    of mq_getsetattr, mq_notify, mq_timedreceive, and mq_timedsend syscalls
    as file descriptors.
  * Added decoding of get_tls syscall on arm.
  * Added -e trace=%pure option for tracing system calls with no arguments that
    never fail.
  * Updated lists of IPV6_*, MAP_*, MEMBARRIER_CMD_*, MSG_*, NT_*, PKEY_*,
    SHM_*, and TCP_* constants.
  * Added manual page for the strace-log-merge command.
  * Updated lists of ioctl commands from Linux 4.15.
  * Implemented biarch support for s390x.
  * Implemented an optional support for symbol demangling in strace -k output
    (activated by --with-libiberty configure option).
  * Information about availability of demangling and reliable personality
    decoding (on architectures with multiple personalities) is now available
    in strace -V output.
  * Added decoding of pkey_alloc, pkey_free, and pkey_mprotect syscalls on
    powerpc and powerpc64.
  * Enhanced manual page.

* Bug fixes
  * Fixed multi-personality support in cross builds.
  * Added mq_getsetattr, mq_notify, mq_open, mq_timedreceive, and mq_timedsend
    syscalls to %desc tracing set.
  * Fixed path tracing support for mmap syscalls with indirect arguments and
    for old select syscall.
  * Fixed decoding of arm-specific (__ARM_NR_*) syscalls.
  * Fixed open mode flags decoding.
  * Fixed corner cases in handling of strace -ff -ttt logs by strace-log-merge.
  * Error counts that exceed one billion are now printed correctly in call
    summary output.
  * Fixed call summary header for x32 personality.
  * Changes of tracee personalities are reported more reliably.
  * Fixed the case when strace attaches to a tracee being inside exec and its
    first syscall stop is syscall-exit-stop instead of syscall-enter-stop,
    which messed up all the syscall state tracking.
  * Fixed printing of higher 32 bits of the return value for x32 personality.

* Portability
  * A C compiler that supports "for" loop initial declarations is now required.
  * Inability to configure multiple personality support on architectures where
    multiple personalities are supported leads to configuration failure during
    build now.  Use --enable-mpers=check to revert to the old behaviour.
  * Build-time requirement for the mpers support has been lowered from gawk 4
    to gawk 3.
  * Removed incomplete and non-functional support for the CRIS architecture.
  * Removed incomplete and unused support for IA-32 mode on the IA-64
    architecture.

Noteworthy changes in release 4.20 (2017-11-13)
===============================================

* Improvements
  * Implemented decoding of NETLINK_NETFILTER netlink message types and flags.
  * Implemented decoding of SECCOMP_GET_ACTION_AVAIL operation of seccomp
    syscall.
  * Updated lists of ARPHRD_*, BPF_*, ETH_P_*, LOOP_*, MADV_*,
    MEMBARRIER_CMD_*, MFD_*, SECCOMP_*, SO_*, SOL_*, TCP_*, and UFFD_FEATURE_*
    constants.
  * Added decoding of statx syscall on hppa.
  * Updated lists of ioctl commands from Linux 4.14.

* Bug fixes
  * Fixed powerpc personality support on powerpc64.

Noteworthy changes in release 4.19 (2017-09-05)
===============================================

* Changes in behaviour
  * Changed formatting of personality names on tile architecture in order
    to make it in line with other multi-personality architectures.
  * Changed field output order in struct v4l2_requestbuffers to improve in/out
    field formatting.
  * Changed handling of multiple signal= specifications in an injection
    expression: multiple specification now leads to error instead of implicit
    usage the last specification.

* Improvements
  * Enhanced decoding of optlen argument of getsockopt syscall.
  * Enhanced decoding of SO_LINGER option of getsockopt and setsockopt syscalls.
  * Enhanced decoding of SO_PEERCRED option of getsockopt syscall.
  * Enhanced decoding of IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP,
    IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_JOIN_ANYCAST,
    IPV6_LEAVE_ANYCAST, MCAST_JOIN_GROUP, and MCAST_LEAVE_GROUP options
    of setsockopt syscall.
  * Enhanced decoding of KEYCTL_DH_COMPUTE operation of keyctl syscall
    (KDF parameters decoding).
  * Implemented decoding of KEYCTL_RESTRICT_KEYRING operation of keyctl syscall.
  * Enhanced decoding of UFFDIO_API ioctl command.
  * Enhanced decoding of BPF_PROG_LOAD, BPF_MAP_CREATE, BPF_MAP_LOOKUP_ELEM,
    and BPF_MAP_GET_NEXT_KEY commands of bpf syscall.
  * Implemented decoding of linux socket filter programs specified
    for SO_ATTACH_FILTER and SO_ATTACH_REUSEPORT_CBPF socket options.
  * Implemented decoding of inet_diag_req_v2, inet_diag_req_compat,
    packet_diag_msg, and smc_diag_msg netlink attributes of NETLINK_SOCK_DIAG.
  * Implemented NETLINK_SELINUX protocol specific decoding.
  * Implemented decoding of netlink message ack flags.
  * Implemented decoding of nlmsgerr netlink attributes.
  * Implemented basic protocol specific decoding of NETLINK_CRYPTO.
  * Implemented decoding of crypto_user_alg netlink attributes
    of NETLINK_CRYPTO.
  * Implemented basic protocol specific decoding of addr, addrlabel, dcb, link,
    mdb, neigh, neightbl, netconf, nsid, route, rule, tc, and tca messages
    of NETLINK_ROUTE.
  * Implemented decoding of NETLINK_KOBJECT_UEVENT messages.
  * Improved handling of unexpected tracees (the ones that cloned with
    CLONE_PARENT/CLONE_PTRACE or called PTRACE_TRACEME on themselves): they
    are now PTRACE_DETACH'ed instead of PTRACE_CONT'ed.
  * Updated lists of BPF_*, KEY_*, RWF_*, SCM_*, SO_*, and *_MAGIC constants.
  * Added decoding of arch_prctl syscall on x86.
  * Added decoding of seccomp, bpf, userfaultfd, membarrier, mlock2,
    copy_file_range, preadv2, pwritev2, and statx on alpha.
  * Added decoding of statx syscall on microblaze.
  * Added decoding of s390_guarded_storage syscall on s390.
  * Updated lists of ioctl commands from Linux 4.13.
  * Enhanced manual page.

* Bug fixes
  * Fixed printing of group_req structure on non-native personalities.
  * Fixed output formatting of blkpg_ioctl_arg, dm_name_list, and iocb
    structures.
  * Fixed formatting of nul-terminated strings which have kernel-imposed size
    limit.
  * Fixed printing of paths that hit PATM_MAX limit in order to match kernel's
    behaviour.
  * Fixed build warnings on Android mips64.
  * Fixed unused function "is_negated_errno" build warning when built
    with clang.
  * Fixed syscall number and arguments retrieval behaviour on sparc64 and
    mips o32 after prctl(PR_SET_DUMPABLE, 0) makes PTRACE_PEEKTEXT impossible
    to use if Linux kernel has commit v4.10-rc1~114^2~2.
  * Fixed path tracing for execveat, symlink, symlinkat, inotify_add_watch,
    and inotify_init syscalls.
  * Fixed personality switch printing on sparc64 and risc-v.

Noteworthy changes in release 4.18 (2017-07-05)
===============================================

* Improvements
  * Implemented decoding of SCM_TIMESTAMP* control messages.
  * Implemented decoding of netlink NLMSG_DONE messages.
  * Implemented decoding of netlink generic nlmsg_type and nlmsg_flags.
  * Implemented decoding of NETLINK_AUDIT, NETLINK_NETFILTER, NETLINK_ROUTE,
    NETLINK_SELINUX, NETLINK_SOCK_DIAG, and NETLINK_XFRM message types.
  * Implemented decoding of NETLINK_GENERIC protocol families.
  * Implemented basic protocol specific decoding of AF_INET, AF_INET6,
    AF_NETLINK, AF_PACKET, AF_SMC, and AF_UNIX messages of NETLINK_SOCK_DIAG.
  * Implemented basic decoding of netlink attributes.
  * Implemented basic protocol specific decoding of AF_INET, AF_NETLINK,
    AF_PACKET, AF_SMC, and AF_UNIX netlink attributes of NETLINK_SOCK_DIAG.
  * Implemented decoding of inet_diag_msg, netlink_diag_msg, and unix_diag_msg
    netlink attributes of NETLINK_SOCK_DIAG.
  * Updated lists of ARPHRD_*, KEYCTL_*, NDIAG_SHOW_*, RTM_*, SCM_*, SCTP_*,
    SO_*, V4L2_*, and prctl ARCH_* constants.
  * Updated lists of ioctl commands from Linux 4.12.

* Bug fixes
  * In interactive mode (-I2), those signals that were blocked at startup
    will remain blocked for the whole period of strace execution.
  * strace no longer resets SIGCHLD handler in tracees to the default action.
  * When traced command is terminated by a blocked signal, strace unblocks
    that signal to ensure its own termination with the same signal.
  * Fixed corner cases in decoding of old sigaction syscall.
  * Fixed build with old kernel headers on mips.
  * Fixed build on aarch64 and tile with glibc >= 2.26.
  * Fixed build on arc and nios2.

Noteworthy changes in release 4.17 (2017-05-24)
===============================================

* Changes in command line syntax
  * Syscall classes specified in -e trace= option now have % prefix (like
    -e trace=%process).  Old style class names without leading % are still
    supported, but considered deprecated now.

* Improvements
  * Optimized syscall filtering.
  * Improved representation of timestamps.
  * Enhanced decoding of sched_setattr syscall.
  * Added -e trace=%stat option for tracing variants of stat syscall.
  * Added -e trace=%lstat option for tracing variants of lstat syscall.
  * Added -e trace=%fstat option for tracing variants of fstat and fstatat
    syscalls.
  * Added -e trace=%%stat option for tracing syscalls used for querying file
    status information (stat, lstat, fstat, fstatat, statx, and their
    variations).
  * Added -e trace=%statfs option for tracing statfs, statfs64 and statvfs
    syscalls.
  * Added -e trace=%fstatfs option for tracing fstatfs, fstatfs64 and fstatvfs
    syscalls.
  * Added -e trace=%%statfs option for tracing syscalls used for querying file
    system statistics information (statfs-like, fstatfs-like and ustat).
  * Added -e trace=/regex option for filtering syscalls using regular
    expressions.
  * Added support for prepending of question mark before syscall qualification
    in -e trace expressions in order to suppress error in case no syscalls
    matched the provided qualification.
  * Implemented decoding of signal mask in rt_sigreturn syscall on alpha, arc,
    arm, avr32, bfin, cris, hppa, m68k, metag, microblaze, mips, nios2, or1k,
    powerpc, powerpc64, riscv, sh, sh64, sparc, sparc64, tile, x86, and xtensa
    architectures.
  * Implemented decoding of statx syscall.
  * Implemented decoding of NS_* ioctl commands.
  * Implemented decoding of the remaining V4L2_BUF_TYPE_* types.
  * Implemented decoding of VIDIOC_[SG]_TUNER ioctl commands.
  * Implemented decoding of NLMSG_ERROR netlink messages.
  * Improved decoding of BPF_PROG_ATTACH command of bpf syscall.
  * Improved decoding of misplaced parts in DM_* ioctl commands.
  * Updated lists of ioctl commands from Linux 4.11.

* Bug fixes
  * Fixed decoding of flags argument of preadv2 and pwritev2 syscalls on x32.
  * Fixed the number of arguments and tracing flags of alpha specific syscalls.
  * Fixed decoding of old sigsuspend syscall on alpha, cris, mips, powerpc,
    powerpc64, sh, sh64, sparc, and sparc64.
  * Fixed decoding of sgetmask and ssetmask syscalls on 64-bit architectures.
  * Fixed decoding of netlink messages received within struct msghdr.
  * Worked around a bug in miscompiled aarch64 kernels leading to the 3rd
    argument of sched_getattr syscall being not quite 32-bit.
  * Fixed corner cases of printing inaccessible times argument of utimes
    and futimesat syscalls.

Noteworthy changes in release 4.16 (2017-02-14)
===============================================

* Improvements
  * Implemented syscall return value injection (-e inject=SET:retval= option).
  * Implemented signal injection (-e inject=SET:signal= option).
  * Implemented decoding of SUID_DUMP_* constants in PR_[GS]ET_DUMPABLE.
  * Implemented decoding of all SG_* ioctl commands.
  * Implemented decoding of ustat syscall.
  * Implemented decoding of BPF_OBJ_PIN, BPF_OBJ_GET, BPF_PROG_ATTACH,
    and BPF_PROG_DETACH commands of bpf syscall.
  * Enhanced decoding of sg_io_hdr and sg_io_v4 structures.
  * Enhanced decoding of get_robust_list, getrandom, io_submit, set_robust_list
    syscalls.
  * Enhanced decoding of entities of kernel long type on x32 and mips n32 ABIs.
  * Updated lists of IP_*, IPV6_*, and LOOP_* constants.
  * Updated lists of ioctl commands from Linux 4.10.
  * Added decoding of recently added syscalls on avr32, microblaze, ppc,
    and ppc64.

* Bug fixes
  * Fixed pathmatch of oldselect syscall on 64-bit architectures.
  * Fixed decoding of mmap2 syscall on s390 when arguments are not available.
  * Fixed decoding of kexec_file_load, mprotect, pkey_mprotect, prctl, preadv*,
    and pwritev* syscalls on x32.
  * Fixed printing of string arguments of getxattr and setxattr syscalls
    when -s option is used to limit the printed string size.
  * Fixed decoding of ifconf, ifreq, and loop_info structures on non-native
    personalities.
  * Fixed decoding of SG_* and LOOP_* ioctl commands.
  * Fixed build on mips with musl libc.
  * Fixed cross-building of ioctlsort.
  * Applied minor formatting fixes to the manual page.

Noteworthy changes in release 4.15 (2016-12-14)
===============================================

* Changes in behavior
  * Time stamps are now printed according to ISO 8601.
  * Changed output format of val3 parameter of futex FUTEX_WAKE_OP operation.
  * The last argument of mincore, sched_getaffinity, and sched_setaffinity
    syscalls is now formatted as an array.

* Improvements
  * Implemented syscall fault injection (-e fault=... option).
  * Implemented decoding of DM_* ioctl commands.
  * Implemented decoding of attr parameter of perf_event_open syscall.
  * Implemented decoding of pkey_alloc, pkey_free, and pkey_mprotect syscalls.
  * Implemented dumping of mq_timedsend and mq_timedreceive syscalls.
  * Implemented decoding of PR_SET_FP_MODE and PR_GET_FP_MODE operations
    of prctl syscall.
  * Implemented PTRACE_GETREGS API support on m68k.
  * Updated lists of ARCH_*, BPF_*, BTRFS_*, FALLOC_*, MS_*, *_MAGIC,
    and V4L2_* constants.
  * Updated lists of ioctl commands from Linux 4.9.
  * Added decoding of recently added syscalls on arc, x32, and xtensa.
  * Enhanced manual page.

* Bug fixes
  * Fixed corner cases in decoding of exit, exit_group, futimesat, getgroups,
    getresuid, init_module, inotify_init1, kcmp, kexec_load, lookup_dcookie,
    mq_getsetattr, mq_notify, mq_open, mq_timedreceive, mq_timedsend,
    name_to_handle_at, prctl, process_vm_readv, process_vm_writev, setfsuid,
    setgroups, setns, unshare, and utimes syscalls.
  * Fixed handling of verbose flag in printing of controls array
    of struct v4l2_ext_controls.
  * Fixed omission of field names in the output of capability, sigaction,
    sigevent, statfs, timespec, timeval, and utimbuf structures.
  * Fixed printing of unknown syscalls in siginfo structure.
  * Fixed decoding of ioctl constants on m68k.
  * Fixed cris architecture support.
  * Fixed cross build when host compiler does not support the same
    set of warning flags as the cross compiler.
  * Fixed build on SLE10 and SLE11.

Noteworthy changes in release 4.14 (2016-10-04)
===============================================

* Changes in behavior
  * When using -p option without a command and no processes has been attached,
    strace exits with exit status 1.

* Improvements
  * Added printing of the mode argument of open and openat syscalls
    when O_TMPFILE flag is set.  (Addresses Fedora bug #1377846).
  * Enhanced -e abbrev=set, -e raw=set, and -e verbose=set.
  * Enhanced decoding of futex, keyctl, quotactl, timerfd_settime,
    and aio family syscalls.
  * Implemented fetching of the 7th subcall argument on mips o32.
  * Updated lists of BPF_*, ETH_P_*, KEXEC_ARCH_*, SCTP_*, TCP_*, and *_MAGIC
    constants.
  * Updated lists of ioctl commands from Linux 4.8.
  * Added decoding of new syscalls on sh and sh64.
  * Added RISC-V architecture support.

* Bug fixes
  * Marked io_setup and io_destroy as memory mapping related syscalls.
  * Fixed leakage of placeholder descriptors to tracees.
  * Fixed printing of mode_t, umode_t, and umask types.
  * Fixed decoding of iovec arrays without a limit on total data size.
  * Fixed decoding of fadvise64, fallocate, futex, keyctl, quotactl, readahead,
    and ipc family syscalls.
  * Fixed decoding of invalid syscalls mapped to indirect subcalls.
  * Fixed decoding of struct btrfs_ioctl_vol_args_v2 on non-native
    personalities.
  * Fixed decoding of PTRACE_DETACH on sparc and sparc64.
  * Fixed decoding of struct stat64 on sparc64.
  * Fixed decoding of uid and gid-related syscalls on sparc64.
  * Fixed decoding of the forth argument of semctl syscall on sparc64.
  * Fixed values of tty ioctl constants on sparc64.
  * Fixed sparc personality support on sparc64.

Noteworthy changes in release 4.13 (2016-07-26)
===============================================

* Improvements
  * Implemented a general netlink socket parser.
  * Enhanced decoding of socket addresses.
  * Enhanced decoding of cmsghdr, msghdr, and mmsghdr structures.
  * Enhanced decoding of accept, accept4, bind, getpeername, getsockname,
    ipc, recvfrom, recvmsg, recvmmsg, sendto, sendmmsg, and socketcall syscalls.
  * Updated lists of AF_*, BPF_MAP_TYPE_*, KEY_*, KEYCTL_*, RWF_*, SS_*,
    and *_MAGIC constants.
  * Updated lists of ioctl commands from Linux 4.7.

* Bug fixes
  * Fixed decoding of pid_t argument of prlimit64 syscall.
  * Fixed sign extension issues in the parser of struct rusage.
  * Fixed race condition in decoding of timeout argument of recvmmsg and
    rt_sigtimedwait syscalls.
  * Fixed build with fresh linux kernel headers.

Noteworthy changes in release 4.12 (2016-05-31)
===============================================

* Improvements
  * Implemented simultaneous use of -p option and tracing of a command.
    (addresses Debian bug #549942).
  * Implemented caching of netlink conversations to reduce amount of time
    spent in decoding socket details in -yy mode.
  * Implemented -yy mode decoding of protocol:portid pairs associated with
    netlink socket descriptors.
  * Implemented decoding of copy_file_range, preadv2, and pwritev2 syscalls.
  * Implemented dumping of preadv, preadv2, pwritev, pwritev2, and vmsplice
    syscalls.
  * Implemented decoding of BTRFS_* and UFFDIO_* ioctl commands.
  * Enhanced decoding of BLK*, EVIOC*, RTC_*, and VIDIOC_* ioctl commands.
  * Enhanced decoding of fstatfs, fstatfs64, get_mempolicy, getdents,
    getdents64, getgroups, getpriority, kill, mbind, migrate_pages, mknod,
    mknodat, personality, poll, ppoll, quotactl, rt_sigpending,
    rt_sigqueueinfo, rt_sigtimedwait, rt_tgsigqueueinfo, sched_getaffinity,
    sched_setaffinity, seccomp, set_mempolicy, setgroups, setpriority, statfs,
    statfs64, tgkill, waitid, and xattr family syscalls.
  * Enhanced decoding of getxpid, getxuid, and getxgid syscalls on alpha.
  * Enhanced decoding of pipe syscall on alpha, ia64, mips, sh, and sparc.
  * Added decoding of bind, listen, and setsockopt direct syscalls on sparc.
  * Added decoding of osf_statfs64 and osf_fstatfs64 syscalls on alpha.
  * Added decoding of fadvise64 and fadvise64_64 on s390.
  * Updated lists of AF_*, BPF_MAP_TYPE_*, CLONE_*, EPOLL*, IPV6_*, MADV_*,
    MSG_*, PTRACE_*, SEGV_*, SO_*, SOL_*, *_MAGIC, and quotactl constants.
  * Updated lists of ioctl commands from Linux 4.6.

* Bug fixes
  * Fixed build on arc, metag, nios2, or1k, and tile architectures.
  * Fixed decoding of 32-bit times syscall return value on 64-bit architectures.
  * Fixed decoding of mlock2 syscall on sparc.
  * Fixed decoding of osf_shmat syscall on alpha.
  * Fixed decoding of syscalls unknown to the kernel on s390/s390x.
    (addresses Debian bug #485979 and Fedora bug #1298294).
  * Fixed decoding of preadv syscall in case of short read.
  * Fixed decoding and dumping of readv syscall in case of short read.
  * Fixed dumping of recvmsg and recvmmsg syscalls in case of short read.
  * Fixed decoding of mincore syscall's last argument.
  * Fixed remaining errors in mapping between syscall numbers and numbers
    of syscall arguments.
  * Applied various fixes to strace-graph script.

Noteworthy changes in release 4.11 (2015-12-21)
===============================================

* Changes in behavior
  * Some syscalls have different names depending on architecture and
    personality.  In these cases, syscall filtering and printing now
    consistently uses the names that match corresponding __NR_* kernel
    macros of the tracee's architecture and personality.
  * Added strace prefix to all diagnostic messages.

* Improvements
  * Enhanced and extended test suite.
  * Implemented reliable tracing of processes whose personality differs
    from the personality of strace, fixed decoding of 32-bit personality
    syscalls on 64-bit architectures.
  * When some data referenced by syscall arguments is irrelevant or cannot
    be read from tracee's memory, strace now prints its address consistently.
  * When a syscall is restarted using restart_syscall mechanism, strace now
    shows the syscall name on architectures that expose this information.
  * Print values returned by epoll_create1, eventfd, eventfd2, fanotify_init,
    inotify_init1, perf_event_open, pipe, pipe2, signalfd, signalfd4, socket,
    socketpair, timerfd, and timerfd_create syscalls, as well as F_DUPFD and
    F_DUPFD_CLOEXEC fcntl commands, as file descriptors.
  * Optimized decoding of indirect socket syscalls.
  * Implemented decoding of nanoseconds along with seconds in stat family
    syscalls (addresses Fedora bug #1251176).
  * Implemented decoding of struct statfs.f_flags in statfs syscall.
  * Implemented decoding of siginfo_t.si_syscall and siginfo_t.si_arch
    in SIGSYS signal.
  * Implemented decoding of indirect syscall on mips o32.
  * Implemented decoding of IPPROTO_IP control messages.
  * Implemented decoding of setsockopt syscall multicast arguments.
  * Enhanced decoding of struct sigevent.
  * Enhanced decoding of block, loop, mtd, ptp, rtc, SG_IO, socket, tty,
    and v4l2 ioctl syscall arguments.
  * Enhanced decoding of epoll_create, fcntl, fcntl64, futex, getdents,
    getdents64, getsockopt, io_*, mount, msgctl, prctl, quotactl, recvfrom,
    sendfile, setsockopt, and shmctl syscalls.
  * Implemented decoding of bpf, execveat, ioperm, iopl, kcmp, kexec_file_load,
    lookup_dcookie, membarrier, memfd_create, mlock2, name_to_handle_at,
    open_by_handle_at, sched_getattr, sched_setattr, and userfaultfd syscalls.
  * Updated lists of AF_*, EPOLL_*, FALLOC_FL_*, F_*, INPUT_PROP_*, IPPROTO_*,
    IPV6_*, IP_*, KEY_*, LOCK_*, MNT_*, MS_*, PACKET_*, PERF_FLAG_*, PF_*,
    PR_*, PTRACE_O_*, RENAME_*, SCTP_*, SECBIT_*, SO_*, TCP_*, and siginfo_t
    constants.
  * Added Nios II architecture support.
  * Added new syscall entries to match Linux 4.4.

* Bug fixes
  * Fixed potential short read of strings from tracee's memory.
  * Fixed -qq option in conjunction with -o option.
  * Fixed filtering of <unavailable> syscalls.
  * Fixed decoding of ioctl syscall command on aarch64 and 32-bit architectures
    with 64-bit aligned structures.
  * Fixed decoding of eventfd2, epoll_create1, signalfd4, and sync_file_range2
    syscall flags arguments.
  * Fixed decoding of 4th argument of clock_nanosleep syscall.
  * Fixed decoding of getpagesize syscall on m68k.
  * Fixed decoding of getrandom and seccomp syscalls on aarch64.
  * Fixed decoding of timezone argument of gettimeofday and settimeofday
  * syscalls.
  * Fixed decoding of offset argument of mmap2 syscall on arm, sparc,
    and sparc64.
  * Fixed decoding of pipe syscall on alpha and mips.
  * Fixed decoding of pipe2 syscall on ia64, sh, sparc, and sparc64.
  * Fixed decoding of signal mask argument of pselect6 syscall on x32.
  * Fixed decoding of signal mask of rt_sigreturn syscall on aarch64, m68k,
    and x32.
  * Fixed decoding of 4th argument of semctl indirect syscall.
  * Fixed decoding of sa_restorer and sa_mask of sigaction syscall on m68k.
  * Fixed decoding of statfs64 and fstatfs64 syscalls on arm eabi.
  * Fixed decoding of struct dirent on x32.
  * Fixed decoding of times syscall return value on mips n32 and x32.
  * Fixed decoding of path argument of umount2 syscall
    (addresses Debian bug #785050).
  * Worked around a kernel bug in tracing privileged executables.
  * Fixed various errors in mapping between syscall numbers and associated
    information like the number of syscall arguments, the name of syscall,
    and syscall decoder.

Noteworthy changes in release 4.10 (2015-03-06)
===============================================

* Improvements
  * Added -yy option to print protocol and address information associated with
    socket descriptors.
  * Extended "-e read=set" and "-e write=set" options to cover sendmsg,
    recvmsg, sendmmsg, and recvmmsg syscalls.
  * Implemented full 32-bit decoding of ioctl commands
    (addresses Debian bug #692913 and Fedora bug #902788).
  * Implemented PTRACE_GETREGS API support on ia64.
  * Implemented PTRACE_GETREGS API support on mips.
  * Implemented PTRACE_GETREGSET API support on s390/s390x.
  * Implemented decoding of getrandom and seccomp syscalls.
  * Implemented full decoding of 64-bit capability sets.
  * Implemented decoding of all prctl commands.
  * Implemented decoding of parametrized ioctl commands.
  * Implemented decoding of evdev ioctl commands.
  * Implemented decoding of v4l ioctl commands.
  * Implemented decoding of SG_IO v4 ioctl commands.
  * Implemented decoding of FIFREEZE/FITHAW/FITRIM ioctl commands.
  * Implemented decoding of FALLOC_FL_* fallocate flags.
  * Implemented decoding of rt_sigreturn signal mask on aarch64,
    x32, and x86_64.
  * Enhanced socket decoder to support bluetooth sockets.
  * Enhanced decoding of unlisted ioctl commands.
  * Enhanced decoding of getsockopt and setsockopt syscall.
  * Enhanced decoding of sysinfo syscall.
  * Enhanced decoding of struct cmsghdr.
  * Enhanced decoding of wait status.
  * Enhanced aio support on non-x86 architectures by using external libaio.h.
  * Added O_TMPFILE to the list of recognized open mode flags.
  * Updated the list of filesystem type constants that is used in decoding
    statfs family syscalls.
  * Updated lists of CAP_*, PR_*, PTRACE_*, SCHED_*, SO_*, SOL_*, SWAP_FLAG_*,
    and TFD_* constants.
  * Updated lists of signal constants from Linux 3.19.
  * Updated lists of errno constants from Linux 3.19.
  * Updated lists of ioctl commands from Linux 3.9.
  * Added new syscall entries to match Linux 3.19.

* Bug fixes
  * Fixed various errors in mapping between syscall numbers and associated
    information like the number of syscall arguments, the name of syscall,
    and syscall decoder.
  * Fixed quoting issues in printing descriptors, filenames, network interface
    names, struct utsname members, device/volume names of BLK* ioctl commands.
  * Fixed uid_t/git_t decoding.
  * Fixed potential out-of-bounds read issues in getdents/getdents64 decoders.
  * Fixed potential open flags truncation on some architectures.
  * Fixed decoding of struct ifreq.ifr_name.
  * Fixed decoding of SIOCSIFNAME ioctl command.
  * Fixed decoding of RENAME_* renameat2 flags.
  * Fixed decoding of UTIME_NOW/UTIME_OMIT timeval structures.
  * Fixed decoding of indirect ipc subcalls on some architectures.
  * Fixed decoding of fanotify_mark syscall on 32-bit architectures.
  * Fixed decoding of 32-bit stat structures on 64-bit architectures.
  * Fixed decoding of 32-bit struct cmsghdr on 64-bit architectures.
  * Fixed decoding of 32-bit preadv/pwritev offset on 64-bit architectures.
  * Fixed decoding of sigreturn/rt_sigreturn signal mask on ia64, ppc, ppc64,
    sparc, sparc64, mips, and s390.
  * Fixed instruction pointer output (-i option) on architectures that support
    several personalities.
  * Fixed behaviour of "-e read=set" and "-e write=set" when read and write
    sets intersect.
  * Fixed build on systems where struct sigaction has no sa_restorer member.
  * Fixed build with uclibc and musl libc.

* Portability
  * Linux kernel >= 2.5.46 is required.
    Older versions without a decent PTRACE_SETOPTIONS support will not work.
  * On mips, linux kernel >= 2.6.15 is required.
    Older versions without a decent PTRACE_GETREGS support will not work.
  * On s390 and s390x, linux kernel >= 2.6.27 is required.
    Older versions without a decent PTRACE_GETREGSET support will not work.

Noteworthy changes in release 4.9 (2014-08-15)
==============================================

* Changes in behavior
  * Disabled OABI support on ARM EABI systems by default,
    added --enable-arm-oabi option to enable it at configure time.

* Improvements
  * Added experimental -k option to print stack trace after each traced syscall.
  * Added -w option to produce stats on syscall latency.
    (addresses Debian bug #457497).
  * Added ARC architecture support.
  * Added PTRACE_GETREGS API support on PowerPC.
  * Enhanced Bionic libc and musl libc support.
  * Enhanced tracing of x86 personality processes on x86_64 and x32.
  * Enhanced tracing of ARM personality processes on AArch64.
  * Enhanced 32/64bit personality detection on PowerPC.
  * Implemented decoding of add_key, ioprio_get, ioprio_set, kexec_load, keyctl,
    renameat2, and request_key syscalls.
  * Robustified decoding of select, pselect, and io_submit syscalls.
  * Enhanced decoding of delete_module, fanotify_init, fanotify_mark, fcntl,
    setdomainname, sethostname, setns, and sync_file_range syscalls.
  * Enhanced decoding of signal bitmasks.
  * Enhanced decoding of file descriptors.
  * Enhanced siginfo_t decoding.
  * Enhanced PF_NETLINK decoding.
  * Updated CLOCK_* constants
    (addresses Fedora bug #1088455).
  * Added new syscall entries to match Linux 3.16.

* Bug fixes
  * Added shmat and shmdt to the set of memory mapping related syscalls.
  * Fixed detaching from stopped processes.
  * Fixed fanotify_mark decoding on 32bit architectures.
  * Fixed offset decoding in preadv and pwritev syscalls.
  * Fixed select decoding for glibc in _FORTIFY_SOURCE mode.
  * Fixed decoding of epoll_ctl syscall with EPOLL_CTL_DEL argument.
  * Fixed build when <sys/ptrace.h> and <linux/ptrace.h> conflict
    (addresses Fedora bug #993384).
  * Miscellaneous corrections in the manual page.
    (Addresses Debian bug #725987).

Noteworthy changes in release 4.8 (2013-06-03)
==============================================

* Changes in behavior
  * In case of normal strace termination, when the trace output is
    redirected to a pipe, strace now closes it and waits for the pipe
    process termination before exit.

* Improvements
  * Implemented tracing using PTRACE_SEIZE API (when available).
  * Implemented more reliable PTRACE_GETREGSET-based process personality
    detection on x86-64 and x32 (when available).
  * Added -e trace=memory option for tracing memory mapping related syscalls.
  * Documented -b option.
  * Allowed exit status messages to be suppressed by giving -q option twice.
  * Added AArch64 architecture support
    (addresses Debian bug #693074 and Fedora bug #969858).
  * Added support for OpenRISC 1000, Meta, and Xtensa architectures.
  * Added tilegx personality support for Tile.
  * Enhanced support of NOMMU architectures.
  * Enhanced decoding of getdents, mmap, perf_event_open, ptrace, and
    quotactl syscalls.
  * Added new syscall entries to match Linux 3.9.
  * Regenerated the list of common ioctl names from Linux 3.9.
  * Updated the list of errno constants.
  * Updated lists of AF_*, MADV_*, MAP_*, MSG_*, MS_*, PF_*, PR_*,
    PTRACE_O_*, and TCP_* constants.
  * Implemented decoding of UBI ioctls.
  * Removed redundant "*32" ioctl names.

* Bug fixes
  * Fixed ERESTARTNOINTR leaking to userspace on ancient kernels
    (addresses Fedora bug #659382).
  * Fixed kernel release string parsing
    (addresses Debian bug #702309).
  * Fixed decoding of *xattr syscalls
    (addresses Fedora bug #885233).
  * Fixed handling of files with 64-bit inode numbers by 32-bit strace
    (addresses Fedora bug #912790).
  * Fixed tracing forks on SPARC.
  * Fixed decoding of fadvise64, fallocate, ftruncate64, io_submit, pread,
    preadv, pwrite, pwritev, readahead, sigaltstack, sync_file_range, sysctl,
    and truncate64 syscalls.
  * Fixed categories of multiple syscalls on most of supported architectures.
  * Fixed decoding of non-native 32-bit personality recv[m]msg syscalls.
  * Fixed decoding of multiple 32-bit personality syscalls on x32.
  * Fixed decoding of long long syscall arguments on ARM, MIPS/o32, PowerPC,
    S390x, and Tile architectures.
  * Fixed semtimedop decoding on S390x.
  * Fixed sram_alloc decoding on Blackfin.
  * Fixed build when process_vm_readv is a stab.
  * Fixed build with older versions of libaio.h.

Noteworthy changes in release 4.7 (2012-05-02)
==============================================

* Changes in behavior
  * strace no longer suspends waitpid until there is a child
    for waitpid'ing process to collect status from.
  * strace no longer detaches from a tracee which is supposed
    to be going to die.
  * strace now issues a new message: "+++ exited with EXITCODE +++"
    which shows exact moment strace got exit notification,
    analogous to existing "+++ killed by SIG +++" message.

* Improvements
  * Added x32 personality support (x86_64 architecture).
  * Added -y and -P options to print file descriptor paths and
    filter by those paths.
  * Added -I option to control strace interactivity.
  * Allowed -p option to take comma or whitespace-separated list of PIDs.
  * Added strace_log_merge script helper to merge timestamped "strace -ff"
    log files.
  * Implemented decoding of clock_adjtime, get_robust_list, migrate_pages,
    preadv, prlimit64, process_vm_readv, process_vm_writev, pwritev,
    recvmmsg, recvmsg, rt_tgsigqueueinfo, sendmmsg, setns, set_robust_list,
    sched_rr_get_interval, splice, syslog, tee and vmsplice syscalls.
  * Enhanced decoding of capget, capset, getrlimit, flistxattr, io_submit,
    listxattr, setrlimit and swapon syscalls.
  * Implemented decoding of loop and mtd ioctls.
  * Added syscall entries for new linux syscalls.
  * Added syscall entries for direct socket system calls on powerpc.
  * Updated the list of errno constants.
  * Updated lists of MSG_*, STA_*, and TCP_* constants.
  * Regenerated the list of ioctl names from Linux 3.3.
  * Enhanced switching between processes with different personalities.
  * Enhanced signals reporting by using short signal names.
  * Made ERESTART* messages more descriptive.
  * Made parsing of numbers from strings more robust.
  * Added support for compat_statfs64 and statfs64.f_flags.
  * Changed read of data blocks to use single process_vm_readv syscall
    (when available) instead of several PTRACE_PEEKDATA operations.
  * Changed read of registers on x86 and x86-64 to use single PTRACE_GETREGS
    operation instead of several PTRACE_PEEKUSER operations.
  * Applied various optimizations to make strace work faster.

* Bug fixes
  * Implemented proper handling of real SIGTRAPs on kernels supporting
    PTRACE_O_TRACESYSGOOD.
    (Addresses Fedora bug #162774).
  * Fixed sockaddr_un.sun_path name in decoded output.
    (Addresses Debian bug #554946).
  * Fixed to avoid potential core file clobbering on exit.
    (Addresses Debian bug #656398).
  * Fixed a typo in documentation.
    (Addresses Debian bug #653309).
  * Fixed decoding of timer id returned by timer_create.
  * Fixed epoll_create1, epoll_wait and epoll_pwait decoding.
  * Fixed *at syscalls flags decoding.
  * Fixed ARM EABI 64-bit syscall's arguments decoding.
  * Fixed semtimedop decoding on s390.
  * Fixed osf_sigprocmask decoding on alpha.
  * Fixed ipc and socket subcall decoding on several architectures.
  * Corrected syscall entries for epoll_pwait, epoll_create, epoll_ctl,
    epoll_wait, mincore, mlockall, prctl, reboot, sendfile, sendfile64,
    sendmsg, sgetmask, ssetmask, swapon, tgkill and tkill syscalls.
  * Corrected io_* syscall entries on ARM.
  * Fixed PID prefix printing in "strace -oLOG -ff -p1 -p2 -p3" case.
  * Fixed logging of unfinished lines in "strace -oLOG -ff" case.
  * Fixed build when libaio-devel is not available.
  * Fixed configure checks for PTRACE_* constants.
  * Fixed compilation warnings remained on several architectures.

* Portability
  * Removed all non-Linux code.  After years of neglect, that dead code
    just hampered further strace development.
  * Linux kernel >= 2.6.18 is recommended.  Older versions might still
    work but they haven't been thoroughly tested with this release.

Noteworthy changes in release 4.6 (2011-03-15)
==============================================

* Changes in behavior
  * Print diagnostic information about changes in personality mode to
    standard error instead of standard output.

* Improvements
  * Implemented a new method of following clone, fork, and vfork
    syscalls using the Linux kernel's explicit facilities for tracing
    creation of threads and child processes.
  * Implemented CLONE_PARENT and CLONE_UNTRACED flags handling.
  * Implemented decoding of TLS syscalls on m68k.
  * Implemented biarch support on powerpc64.
  * Implemented biarch support for getrlimit() and setrlimit().
  * Implemented decoding of struct ucred in getsockopt SO_PEERCRED.
  * Implemented SOL_SCTP socket options decoding.
  * Added HDIO_* ioctl names.
    (Addresses Debian bug #450953).
  * Added LOOP_* ioctl names.
  * Updated lists of CLOCK_*, CLONE_*, MS_*, and SOL_* constants
    to match Linux 2.6.37.
  * Updated the list of IPPROTO_* constants to match netinet/in.h.
  * Implemented decoding of HDIO_* and BLK* ioctls.
  * Added MicroBlaze architecture support.
  * Added new syscall entries to match Linux 2.6.37.
  * Regenerated list of ioctl names from Linux 2.6.37.
  * Enhanced signal notification decoding.
  * Documented -C and -D options.

* Bug fixes
  * Fixed fetching syscall arguments on m68k.
  * Fixed an error when judging whether a process has children.
  * Fixed get/set_robust_list syscall numbers for powerpc.
  * Fixed a corner case in printing clone flags.
  * Fixed cross-compiling issues.
  * Fixed build issues on powerpc64, SH and SPARC.
  * Fixed syscall flags of fstatat*, mmap, mmap2, fadvise64*, swapoff,
    fgetxattr, flistxattr, fremovexattr, epoll_create, fallocate,
    fanotify_init, and fanotify_mark syscalls.
  * Fixed decoding of get[ug]id, gete[ug]id and setfs[ug]id return values.
  * Fixed biarch support in IO dumping.
  * Fixed raw exit_group decoding.
  * Fixed decoding of file descriptors on 64-bit architectures.
  * Fixed a corner case in waitpid handling.
    (Addresses Red Hat bug #663547).
  * Fixed stat64 decoding on mips
    (Addresses Debian bug #599028).
  * Fixed misleading italics in the manual page.
    (Addresses Debian bug #589323).

Noteworthy changes in release 4.5.20 (2010-04-13)
=================================================

* Improvements
  * Implemented decoding of new linux syscalls: inotify_init1, recvmmsg.
  * Implemented basic decoding of new linux syscalls: preadv, pwritev,
    rt_tgsigqueueinfo, perf_event_open.
  * Enhanced decoding of recently added syscalls on non-x86 architectures
    by replacing a bare decoder with elaborate parsers enabled earlier
    for x86/x86-64.
  * Implemented -C option to combine regular and -c output.
    (Addresses Debian bug #466196)
  * Enhanced decoding of mbind and mremap syscalls.
  * Enhanced SOL_PACKET socket options decoding.
  * Regenerated list of ioctl names from linux 2.6.33.
  * Added TILE architecture support.

* Bug fixes
  * Fixed build with Linux kernel headers 2.6.32-rc5+.
    (Addresses Debian bug #560516 and Fedora bug #539044)
  * Fixed build on mips.
  * Fixed handling of Linux systems without struct statfs64.
  * Fixed reporting signal mask by sigreturn on powerpc.
  * Fixed potential stack buffer overflow in select decoder.
    (Addresses Fedora bug #556678)
  * Corrected msgsnd indirect ipccall decoding.
  * Corrected decoding of 64bit syscalls.
    (Addresses Debian bug #570603)
  * Corrected getsockopt decoding on architectures where
    sizeof(long) > sizeof(int).
    (Addresses Debian bug #494844)
  * Corrected decoding of epoll_pwait.
    (Addresses Debian bug #513014)
  * Corrected handling of killed threads.

Noteworthy changes in release 4.5.19 (2009-10-21)
=================================================

* Changes in behavior
  * When command exits, strace now exits with the same exit status.
    If command is terminated by a signal, strace terminates itself
    with the same signal, so that strace can be used as a wrapper
    process transparent to the invoking parent process.
    When using -p option, the exit status of strace is zero unless
    there was an unexpected error in doing the tracing.
    (Addresses Fedora bug #105371 and Debian bug #37665)

* Improvements
  * Implemented decoding of new Linux syscalls: accept4, dup3,
    epoll_create1, eventfd2, inotify_init1, pipe2, signalfd4.
  * Implemented decoding of socket type flags introduced in Linux 2.6.27.
  * Implemented decoding of accept4 socketcall.
  * Enhanced prctl decoding.
  * Enhanced nanosleep decoding.
  * Enhanced ptrace decoding.
  * Enhanced futex decoding.
  * Enhanced CAP_* decoding.
  * Enhanced SIOCS* ioctls decoding.
  * Enhanced fcntl F_* flags decoding.
  * Enhanced semop/semtimedop decoding.
  * Updated ARM architecture support.
  * Added Blackfin architecture support.
  * Added AVR32 architecture support.
  * Added CRIS architecture support.
  * Made strace detect when traced process suddenly disappeared.

* Bug fixes
  * Fixed syscall numbers for tee and sync_file_range.
    (Addresses Debian bug #503124)
  * Fixed several bugs in strings decoder, including potential heap
    memory corruption.
    (Addresses Fedora bugs #470529, #478324 and #511035)
  * Marked sendfile(2) as a network syscall.
    (Addresses Debian bug #509499)
  * Fixed accept(2) decoding.
    (Addresses Debian bug #507573)
  * Fixed sigtimedwait(2) decoding.
  * Fixed build on ARM EABI.
    (Addresses Debian bugs #520084 and #535564, and Fedora bug #507576)
  * Fixed display of 32-bit fcntl(F_SETLK) on 64-bit architectures.
    (Addresses Red Hat bug #471169)
  * Fixed display of 32-bit argv array on 64-bit architectures.
    (Addresses Fedora bug #519480)
  * Fixed display of 32-bit struct sigaction on 64-bit architectures.
  * Fixed HPPA architecture support.
    (Addresses Debian bugs #437928 and #546619)

Changes in 4.5.18
==============
* Bug fixes.
* Support new Linux/PPC system call subpage_prot and PROT_SAO flag.
* In sigaction system call, display sa_flags value along with SIG_DFL/SIG_IGN.

Changes in 4.5.17
==============
* Many bug fixes.
* -F is now deprecated, -f has traced vfork too on Linux for a long time now.
* Print O_CLOEXEC, MSG_CMSG_CLOEXEC flag bits.
* Improved output for prctl system call on Linux.
* Improved support for Linux/ARM.
* SA_NOMASK is now spelled SA_NODEFER, and SA_ONESHOT is spelled SA_RESETHAND.

Changes in 4.5.16
==============
* Bug fixes.
* Improved output for delete_module, futex, and mbind system calls on Linux.
* Improved output for SG_IO ioctls on Linux.
* Support new Linux system calls move_pages, utimensat, signalfd, timerfd,
  eventfd, getcpu, epoll_pwait.

Changes in 4.5.15
==============
* Bug fixes.
* Several biarch improvements.
* Improved output for adjtimex, sysctl, quotactl, mount, umount.
* Support new Linux system calls *at, inotify*, pselect6, ppoll and unshare.

Changes in 4.5.14
==============
* Bug fixes.
* Accept numeric system calls in -e.

Changes in 4.5.13
==============
* Bug fixes.
* Introduce "-e trace=desc".

Changes in 4.5.12
==============
* Bug fixes.
* Better x86-64 support for IA32 processes.
* Update PowerPC system calls.
* Better printing for Linux aio system calls.

Changes in 4.5.11
==============
* Quick fix release for build issues.
* One fix for Linux/ARM system call table.

Changes in 4.5.10
==============
* Bug fixes.
* Print fault address for SIGSEGV/SIGBUS signals when available.

Changes in 4.5.9
==============
* Bug fixes.
* Improve socket ioctl printing.
* Update Linux/IA64 syscall list.
* Fix Linux/x86-64 syscall argument extraction for 32-bit processes.
* Improve mount flags printing.
* Support symbolic printing of x86_64 arch_prctl parameters.

Changes in 4.5.8
==============
* Bug fixes.
* Update syscall tables for Alpha, ARM, HPPA.
* Support new Linux syscalls mbind, set_mempolicy, get_mempolicy, waitid.
* Support Linux syscalls fadvise64, fadvise64_64, and epoll_*.
* Improve ioctl command name matching.
* Print RTC_* ioctl structure contents.
* Support newer RLIMIT_* values.
* Print struct cmsghdr details in sendmsg.

Changes in 4.5.7
==============
* Bug fixes.
* Print attribute values in *xattr system calls on Linux.
* Include pread and pwrite calls in -e read and -e write tracing.
* Update SO_* and IP_* value lists and add IPV6_* values for socket options.
* Print clock_t values symbolically in Linux clock_* system calls.

Changes in 4.5.6
==============
* Bug fixes, Linux ioctl updates.
* David Miller contributed support for Linux/SPARC64.

Changes in 4.5.5
==============
* Just bug fixes.

Changes in 4.5.4
==============
* Update Linux ioctl lists.
* Update PF_* and AF_* value lists.
* The 4.5.3 -p behavior for NPTL threads applies only under -f, and got fixed.

Changes in 4.5.3
==============
* Bug fixes.
* On Linux using NPTL threads, -p will now attach to all threads in a process.
* Handle new mq_* system calls in Linux 2.6.6 and later.

Changes in 4.5.2
==============
* Bug fixes.
* Report some new VM_* bit values on Linux.
* Better output for Linux sched_* system calls.

Changes in 4.5.1
==============
* Bug fixes.
* Display multiple ioctl name matches on Linux.

Changes in 4.5
==============
* New port to AMD's x86-64 architecture. One strace binary can
  handle both new x86-64 and old i386 processes.
* Fixed support for LFS64 calls.
* New switch -E to add/remove environment variables for the command.
* Merged s390/s390x port.
* Trace an unbounded number of processes.
* Handle numerous new system calls in Linux 2.5, and new threads semantics.
* Fixed bugs with attach/detach leaving things stopped.
* Fixed traced process seeing ECHILD despite live, traced children
  in waitpid calls with WNOHANG.
* Stuart Menefy contributed a port to Linux/SH.
* Stephen Thomas contributed a port to Linux/SH64.
* Many other bug fixes.

Changes in 4.4
==============
* Fix Linux/ia64 support, looks like someone renamed a few things on us
* Fix the ioctl setup for Linux, turned out it did not really work.
  Improve the ioctl extractor as well so we decode some more ones.

Changes in 4.3.1
================
* compile fixes for Linux/mips

Changes in 4.3
==============
* Linux ia64 and hppa ports added
* The usual Linux syscall updates (includes 32bit uid/gid support),
* Linux ioctl list updated
* Support IPv6 scope ids
* FreeBSD/i386 port added
* UnixWare and Solaris updates
* Better support for tracing multithreaded processes in Linux

Changes in 4.2
==============
* Compiles on glibc2.0 systems again
* Linux/S390 port added
* The usual Linux syscall updates
* we can follow fork on arm now

Changes in 4.1
================
* Linux/MIPS port added
* Lots of Linux updates again
* Improved IPv6 support
* Add strace-graph

Changes in 4.0.1
================
* Minor bugfixes
* Compiles on glibc2.0 systems again

Changes in 4.0
==============
* Get stat structure properly on Linux 64bit archs
* Personalities work again
* Compile correctly on SunOS again
* IRIX64 updates
* Solaris updates

Changes in 3.99.1
=================
* Linux (ultra)sparc fixes
* Linux alpha fixes
* Minor cleanups

Changes in 3.99
===============
* New maintainer
* add support for more Linux architectures (powerpc, sparc, arm)
* support lots more Linux syscalls
* fix signal handling
* add IPX and IPIP support
* check stray syscall after execv
* fix hanging children

Changes in version 3.1
======================

* Irix5 is supported
* Linux 68k is supported
* Linux alpha is supported
* configure is upgraded to autoconf 2.x
* using -f in combination with -e now works correctly
* output can be piped to a program
* tracing setuid programs works better
* it is now reasonable to install strace setuid to root in some circumstances
* new useful tracing names like file and process to trace whole
  classes of system calls, e.g. -efile traces all system calls that
  take a file name as an argument
* IPC calls on SunOS 4.1.x are decoded
* Linux program memory is reliably dereferenced
* Linux decodes at least the name of all syscalls as of pre2.0.4
* various cosmetic changes and bug fixes

Changes from versions 2.x to version 3.0
========================================

* filename arguments are neither abbreviated nor stringified
* string arguments are now true C strings using octal instead of hex by default
* preprocessor constants are never shortened (e.g. was RDONLY => now O_RDONLY)
* by default the output for multiple processes now goes into one file
* all structures, vectors, bitsets, etc. use consistent output formats
* the -c option now means count calls, -i does what the old -c used to do

New Features in version 3.0
===========================

* non-ascii strings can be optionally printed entirely in hex
* the output format is readable when multiple processes are generating output
* exit values are printed in an alignment column
* is is possible to suppress messages about attaching and detaching
* various tracing features can be enabled on a per syscall/signal/desc basis
* selective tracing of syscalls
* selective printing of syscall structures
* selective abbreviation of long structures on a per syscall basis
* selective printing of raw syscall arguments and results
* selective tracing of signals
* selective dumping of all I/O read from file descriptors
* selective dumping of all I/O written to file descriptors
* optional counting of time, calls, and errors for each syscall
