1 /* Catastrophic failure reports. Linux version.
2 Copyright (C) 1993-2017 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
22 #include <not-cancel.h>
28 writev_for_fatal (int fd
, const struct iovec
*iov
, size_t niov
, size_t total
)
30 INTERNAL_SYSCALL_DECL (err
);
33 cnt
= INTERNAL_SYSCALL (writev
, err
, 3, fd
, iov
, niov
);
34 while (INTERNAL_SYSCALL_ERROR_P (cnt
, err
)
35 && INTERNAL_SYSCALL_ERRNO (cnt
, err
) == EINTR
);
38 #define WRITEV_FOR_FATAL writev_for_fatal
41 backtrace_and_maps (int do_abort
, bool written
, int fd
)
43 if (do_abort
> 1 && written
)
46 #define naddrs (sizeof (addrs) / sizeof (addrs[0]))
47 int n
= __backtrace (addrs
, naddrs
);
50 #define strnsize(str) str, strlen (str)
51 #define writestr(str) write_not_cancel (fd, str)
52 writestr (strnsize ("======= Backtrace: =========\n"));
53 __backtrace_symbols_fd (addrs
+ 1, n
- 1, fd
);
55 writestr (strnsize ("======= Memory map: ========\n"));
56 int fd2
= __open_nocancel ("/proc/self/maps", O_RDONLY
);
59 while ((n2
= __read_nocancel (fd2
, buf
, sizeof (buf
))) > 0)
60 if (write_not_cancel (fd
, buf
, n2
) != n2
)
62 close_not_cancel_no_status (fd2
);
66 #define BEFORE_ABORT backtrace_and_maps
68 #include <sysdeps/posix/libc_fatal.c>