You can subscribe to this list here.
2000 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
(5) |
Oct
(1) |
Nov
|
Dec
(2) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2001 |
Jan
(3) |
Feb
(1) |
Mar
(62) |
Apr
(29) |
May
(4) |
Jun
|
Jul
(11) |
Aug
(30) |
Sep
(8) |
Oct
(31) |
Nov
(2) |
Dec
(13) |
2002 |
Jan
(4) |
Feb
(3) |
Mar
(12) |
Apr
(2) |
May
(7) |
Jun
(2) |
Jul
(7) |
Aug
(5) |
Sep
(4) |
Oct
(8) |
Nov
(5) |
Dec
(17) |
2003 |
Jan
(24) |
Feb
(19) |
Mar
(19) |
Apr
(22) |
May
(18) |
Jun
(16) |
Jul
(21) |
Aug
(48) |
Sep
(31) |
Oct
(45) |
Nov
(52) |
Dec
(54) |
2004 |
Jan
(71) |
Feb
(60) |
Mar
(54) |
Apr
(50) |
May
(88) |
Jun
(76) |
Jul
(62) |
Aug
(35) |
Sep
(20) |
Oct
(37) |
Nov
(66) |
Dec
(45) |
2005 |
Jan
(12) |
Feb
(5) |
Mar
(11) |
Apr
(6) |
May
(6) |
Jun
(6) |
Jul
(29) |
Aug
(61) |
Sep
(17) |
Oct
(45) |
Nov
(34) |
Dec
(17) |
2006 |
Jan
(13) |
Feb
(10) |
Mar
(15) |
Apr
(7) |
May
(13) |
Jun
(24) |
Jul
(12) |
Aug
(9) |
Sep
(17) |
Oct
(61) |
Nov
(58) |
Dec
(77) |
2007 |
Jan
(67) |
Feb
(61) |
Mar
(54) |
Apr
(93) |
May
(104) |
Jun
(131) |
Jul
(187) |
Aug
(116) |
Sep
(66) |
Oct
(41) |
Nov
(56) |
Dec
(19) |
2008 |
Jan
(19) |
Feb
(65) |
Mar
(127) |
Apr
(170) |
May
(137) |
Jun
(160) |
Jul
(168) |
Aug
(139) |
Sep
(104) |
Oct
(51) |
Nov
(69) |
Dec
(126) |
2009 |
Jan
(55) |
Feb
(148) |
Mar
(87) |
Apr
(74) |
May
(151) |
Jun
(121) |
Jul
(111) |
Aug
(97) |
Sep
(107) |
Oct
(177) |
Nov
(101) |
Dec
(84) |
2010 |
Jan
(55) |
Feb
(45) |
Mar
(114) |
Apr
(140) |
May
(152) |
Jun
(132) |
Jul
(115) |
Aug
(118) |
Sep
(105) |
Oct
(32) |
Nov
(26) |
Dec
(44) |
2011 |
Jan
(36) |
Feb
(138) |
Mar
(80) |
Apr
(34) |
May
(52) |
Jun
(72) |
Jul
(27) |
Aug
(119) |
Sep
(77) |
Oct
(71) |
Nov
(58) |
Dec
(50) |
2012 |
Jan
(59) |
Feb
(55) |
Mar
(82) |
Apr
(81) |
May
(31) |
Jun
(8) |
Jul
(13) |
Aug
(8) |
Sep
(10) |
Oct
(44) |
Nov
(13) |
Dec
(15) |
2013 |
Jan
(28) |
Feb
(72) |
Mar
(35) |
Apr
(14) |
May
(162) |
Jun
(55) |
Jul
(39) |
Aug
(20) |
Sep
(25) |
Oct
(15) |
Nov
(84) |
Dec
(14) |
2014 |
Jan
(31) |
Feb
(102) |
Mar
(112) |
Apr
(106) |
May
(105) |
Jun
(87) |
Jul
(36) |
Aug
(112) |
Sep
(31) |
Oct
(23) |
Nov
(68) |
Dec
(42) |
2015 |
Jan
(46) |
Feb
(131) |
Mar
(267) |
Apr
(48) |
May
(27) |
Jun
(42) |
Jul
(41) |
Aug
(41) |
Sep
(28) |
Oct
(22) |
Nov
(27) |
Dec
(45) |
2016 |
Jan
(55) |
Feb
(55) |
Mar
(363) |
Apr
(125) |
May
(173) |
Jun
(159) |
Jul
(69) |
Aug
(111) |
Sep
(130) |
Oct
(115) |
Nov
(26) |
Dec
(70) |
2017 |
Jan
(78) |
Feb
(43) |
Mar
(249) |
Apr
(130) |
May
(35) |
Jun
(436) |
Jul
(293) |
Aug
(423) |
Sep
(81) |
Oct
(16) |
Nov
(35) |
Dec
(110) |
2018 |
Jan
(67) |
Feb
(36) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Dmitry V. L. <ld...@al...> - 2018-02-24 01:35:13
|
Hi, strace-devel mailing list has been moved to the new home. Last few years we experienced problems with long delays in email delivery, last 10 days we started to lose emails and wait for several days for email delivery. We could have moved the mailing list earlier if our previous hoster provided us with the list of subscribers and a usable archive, but, unfortunately, they refused under the pretext of "legal and privacy reasons" [1][2]. Despite of these obstacles, we've managed to reconstruct the mailing list archive from private copies, the new archive is available at https://lists.strace.io/pipermail/strace-devel/. We've also managed to reconstruct the most of subscribers database from previous mailman notifications. Please check your subscription options and re-subscribe if necessary at https://lists.strace.io/mailman/listinfo/strace-devel . Unfortunately, these efforts took a lot of our time and seriously damaged the patch review process. I apologize to those of you who has been waiting for your patches to be reviewed, we'll hopefully clear the backlog soon. [1] https://lists.strace.io/snapshot/sf.net/site-support-16538.html [2] https://lists.strace.io/snapshot/sf.net/lists-admin-strace-devel-members.html -- ldv |
From: Dmitry V. L. <ld...@al...> - 2018-02-23 17:54:38
|
On Mon, Feb 19, 2018 at 03:31:44PM +0100, Eugene Syromiatnikov wrote: > On Thu, Feb 15, 2018 at 12:39:15AM +0100, Andreas Schwab wrote: > > 4.21 fails to build for aarch64: > > > > checking gnu/stubs-32.h usability... no > > checking gnu/stubs-32.h presence... no > > checking for gnu/stubs-32.h... no > > configure: Created empty gnu/stubs-32.h > > checking for m32 personality compile support... no > > checking whether to enable m32 personality support... no > > configure: error: Cannot enable m32 personality support > > As noted in NEWS, strace now enforces mpers support by default (in order > to make aware of the possibilty of incorrect non-native personality > decoding early); looks like your compiler doesn't support producing > binaries for the compat personality. You can either try to use another > compiler or provide --disable-mpers to the configure script. Previous behaviour can be restored by specifying --enable-mpers=check. -- ldv |
From: Eugene S. <ev...@gm...> - 2018-02-23 12:25:39
|
On Fri, Feb 23, 2018 at 8:47 AM, Masatake YAMATO <ya...@re...> wrote: > How about allowing a user to define ones' own class in ~/.strace? By the way, since you've mentioned that, we've been thinking about some options for configuration file for quite some time (not only for custom group generation, but also for color output configuration, lua invasiveness and other not-yet-merged stuff). Does anyone have any ideas regarding a good configuration file syntax? The other question is about prefix for user-configurable groups, it probably shouldn't conflict with any existing syscall qualification syntax, but, for example, "%%%" looks too unwieldy. -- Eugene Syromyatnikov mailto:ev...@gm... xmpp:esyr@jabber.{ru|org} |
From: Masatake Y. <ya...@re...> - 2018-02-23 08:48:01
|
How about allowing a user to define ones' own class in ~/.strace? (cat ~/.strace) classes: - name: xattr - syscall: setxattr - syscall: lsetxattr - syscall: fsetxattr - syscall: getxattr - syscall: listxattr - syscall: removexattr - name: setxattr - syscall: setxattr - syscall: lsetxattr - syscall: fsetxattr So you can do -e trace=%xattr or -e traec=%setxattr as you want. However, I think we cannot say thie extension a microproject:-P Masatake YAMATO > On Thu, 15 Feb 2018 19:07:59 +0530 > Abhishek Tiwari <era...@gm...> wrote: > >> Hi, >> >> I want to work on microproject >> >> extend -e trace=class syntax with new classes >> >> >> I have gone through mailing list. Is following grouping ok >> >> {,l,f}setxattr TRACE_SETXATTR TFX >> >> >> -e trace=%setxattr > > This is a good start, but from what I see, maybe this group is too > small, maybe all the syscalls that deals with xattr should be a better > idea, something like -e trace=%xattr. > > > -- > Gabriel Laskar > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > Strace-devel mailing list > Str...@li... > https://lists.sourceforge.net/lists/listinfo/strace-devel |
From: Gabriel L. <ga...@ls...> - 2018-02-23 08:17:33
|
On Thu, 15 Feb 2018 19:07:59 +0530 Abhishek Tiwari <era...@gm...> wrote: > Hi, > > I want to work on microproject > > extend -e trace=class syntax with new classes > > > I have gone through mailing list. Is following grouping ok > > {,l,f}setxattr TRACE_SETXATTR TFX > > > -e trace=%setxattr This is a good start, but from what I see, maybe this group is too small, maybe all the syscalls that deals with xattr should be a better idea, something like -e trace=%xattr. -- Gabriel Laskar |
From: Andreas S. <sc...@li...> - 2018-02-22 17:40:17
|
On Feb 22 2018, Eugene Syromiatnikov <es...@re...> wrote: > Well, current implementation of AArch64 compat in strace assumes it's > identical to ARMv7 EABI, and I'm trying to figure out how to build mpers > support for it and test it. Your only option is to use an armv7 compiler. Andreas. -- Andreas Schwab, sc...@li... GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." |
From: Eugene S. <es...@re...> - 2018-02-22 17:04:10
|
On Thu, Feb 15, 2018 at 07:07:59PM +0530, Abhishek Tiwari wrote: > Hi, > > I want to work on microproject > > extend -e trace=class syntax with new classes > > > I have gone through mailing list. Is following grouping ok > > {,l,f}setxattr TRACE_SETXATTR TFX Doesn't -e trace='/[lf]?setxattr' cover precisely this set of syscalls on any architecture? > > > -e trace=%setxattr > > Thank you |
From: Eugene S. <es...@re...> - 2018-02-22 00:46:41
|
On Mon, Feb 19, 2018 at 09:21:59PM +0100, Andreas Schwab wrote: > On Feb 19 2018, Eugene Syromiatnikov <es...@re...> wrote: > > > On Mon, Feb 19, 2018 at 07:31:57PM +0100, Andreas Schwab wrote: > >> On Feb 19 2018, Eugene Syromiatnikov <es...@re...> wrote: > >> > >> > On Thu, Feb 15, 2018 at 12:39:15AM +0100, Andreas Schwab wrote: > >> >> 4.21 fails to build for aarch64: > >> >> > >> >> checking gnu/stubs-32.h usability... no > >> >> checking gnu/stubs-32.h presence... no > >> >> checking for gnu/stubs-32.h... no > >> >> configure: Created empty gnu/stubs-32.h > >> >> checking for m32 personality compile support... no > >> >> checking whether to enable m32 personality support... no > >> >> configure: error: Cannot enable m32 personality support > >> > > >> > As noted in NEWS, strace now enforces mpers support by default (in order > >> > to make aware of the possibilty of incorrect non-native personality > >> > decoding early); looks like your compiler doesn't support producing > >> > binaries for the compat personality. You can either try to use another > >> > compiler or provide --disable-mpers to the configure script. > >> > >> There is no such thing as -m32 on aarch64 or riscv64. There is only > >> -mabi=ilp32 or -mabi=ilp32d. > > > > Are you aware of any differences between ARMv7 EABI and AArch32 ABI? > > How is that relevant? This is about aarch64 and riscv64. Well, current implementation of AArch64 compat in strace assumes it's identical to ARMv7 EABI, and I'm trying to figure out how to build mpers support for it and test it. And, judging by [1], it looks like ilp32 ABI is more akin to x32, and it is not supported at all by strace at the moment. [1] https://wiki.linaro.org/Platform/arm64-ilp32 |
From: Abhishek T. <era...@gm...> - 2018-02-21 18:24:46
|
On Mon, Feb 19, 2018 at 3:43 PM, Gabriel Laskar <ga...@ls...> wrote: > On Thu, 15 Feb 2018 19:07:59 +0530 > Abhishek Tiwari <era...@gm...> wrote: > > > Hi, > > > > I want to work on microproject > > > > extend -e trace=class syntax with new classes > > > > > > I have gone through mailing list. Is following grouping ok > > > > {,l,f}setxattr TRACE_SETXATTR TFX > > > > > > -e trace=%setxattr > > This is a good start, but from what I see, maybe this group is too > small, maybe all the syscalls that deals with xattr should be a better > idea, something like -e trace=%xattr. > > > -- > Gabriel Laskar > I have grouped all xattr syscalls and following is attached patch for the same. Please review. -- Abhishek Tiwari M.Tech (CS), IIT Kharagpur. |
From: Andreas S. <sc...@li...> - 2018-02-19 20:34:03
|
On Feb 19 2018, Eugene Syromiatnikov <es...@re...> wrote: > On Mon, Feb 19, 2018 at 07:31:57PM +0100, Andreas Schwab wrote: >> On Feb 19 2018, Eugene Syromiatnikov <es...@re...> wrote: >> >> > On Thu, Feb 15, 2018 at 12:39:15AM +0100, Andreas Schwab wrote: >> >> 4.21 fails to build for aarch64: >> >> >> >> checking gnu/stubs-32.h usability... no >> >> checking gnu/stubs-32.h presence... no >> >> checking for gnu/stubs-32.h... no >> >> configure: Created empty gnu/stubs-32.h >> >> checking for m32 personality compile support... no >> >> checking whether to enable m32 personality support... no >> >> configure: error: Cannot enable m32 personality support >> > >> > As noted in NEWS, strace now enforces mpers support by default (in order >> > to make aware of the possibilty of incorrect non-native personality >> > decoding early); looks like your compiler doesn't support producing >> > binaries for the compat personality. You can either try to use another >> > compiler or provide --disable-mpers to the configure script. >> >> There is no such thing as -m32 on aarch64 or riscv64. There is only >> -mabi=ilp32 or -mabi=ilp32d. > > Are you aware of any differences between ARMv7 EABI and AArch32 ABI? How is that relevant? This is about aarch64 and riscv64. > Thank you for the information regarding RISC-V. Do you have an idea where one > can easily get an environment with both 32-bit and 64-bit runtime for it, by > chance? There is no riscv32 ABI defined yet. Andreas. -- Andreas Schwab, sc...@li... GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." |
From: Eugene S. <es...@re...> - 2018-02-19 19:13:31
|
On Thu, Feb 15, 2018 at 12:39:15AM +0100, Andreas Schwab wrote: > 4.21 fails to build for aarch64: > > checking gnu/stubs-32.h usability... no > checking gnu/stubs-32.h presence... no > checking for gnu/stubs-32.h... no > configure: Created empty gnu/stubs-32.h > checking for m32 personality compile support... no > checking whether to enable m32 personality support... no > configure: error: Cannot enable m32 personality support As noted in NEWS, strace now enforces mpers support by default (in order to make aware of the possibilty of incorrect non-native personality decoding early); looks like your compiler doesn't support producing binaries for the compat personality. You can either try to use another compiler or provide --disable-mpers to the configure script. As GCC for AArch64 doesn't support generating ARM EABI binaries at all, this issue will probably be somehow tackled in the future. > Andreas. > > -- > Andreas Schwab, sc...@li... > GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 > "And now for something completely different." |
From: Andreas S. <sc...@li...> - 2018-02-19 19:00:25
|
On Feb 19 2018, Eugene Syromiatnikov <es...@re...> wrote: > On Thu, Feb 15, 2018 at 12:39:15AM +0100, Andreas Schwab wrote: >> 4.21 fails to build for aarch64: >> >> checking gnu/stubs-32.h usability... no >> checking gnu/stubs-32.h presence... no >> checking for gnu/stubs-32.h... no >> configure: Created empty gnu/stubs-32.h >> checking for m32 personality compile support... no >> checking whether to enable m32 personality support... no >> configure: error: Cannot enable m32 personality support > > As noted in NEWS, strace now enforces mpers support by default (in order > to make aware of the possibilty of incorrect non-native personality > decoding early); looks like your compiler doesn't support producing > binaries for the compat personality. You can either try to use another > compiler or provide --disable-mpers to the configure script. There is no such thing as -m32 on aarch64 or riscv64. There is only -mabi=ilp32 or -mabi=ilp32d. Andreas. -- Andreas Schwab, sc...@li... GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." |
From: Harsha S. <har...@gm...> - 2018-02-18 04:39:09
|
On Sun, Feb 18, 2018 at 9:08 AM, Chen Jingpiao <che...@gm...> wrote: > On 02/16 02:19, Harsha Sharma wrote: >> * tests/netlink_kobject_uevent_libudev.c: New file. >> * tests/gen_tests.in (netlink_kobject_uevent_libudev): New entry. >> * tests/pure_executables.list: Add netlink_kobject_uevent_libudev. >> * tests/.gitignore: Likewise. >> >> Signed-off-by: Harsha Sharma <har...@gm...> >> --- >> tests/.gitignore | 1 + >> tests/gen_tests.in | 1 + >> tests/netlink_kobject_uevent_libudev.c | 88 ++++++++++++++++++++++++++++++++++ >> tests/pure_executables.list | 1 + >> 4 files changed, 91 insertions(+) >> create mode 100644 tests/netlink_kobject_uevent_libudev.c >> >> diff --git a/tests/.gitignore b/tests/.gitignore >> index 2541ec24..623b98f8 100644 >> --- a/tests/.gitignore >> +++ b/tests/.gitignore >> @@ -215,6 +215,7 @@ netlink_crypto >> netlink_generic >> netlink_inet_diag >> netlink_kobject_uevent >> +netlink_kobject_uevent_libudev >> netlink_netfilter >> netlink_netlink_diag >> netlink_protocol >> diff --git a/tests/gen_tests.in b/tests/gen_tests.in >> index 18f36408..263479a5 100644 >> --- a/tests/gen_tests.in >> +++ b/tests/gen_tests.in >> @@ -199,6 +199,7 @@ netlink_audit +netlink_sock_diag.test >> netlink_crypto +netlink_sock_diag.test >> netlink_generic +netlink_sock_diag.test >> netlink_kobject_uevent +netlink_sock_diag.test >> +netlink_kobject_uevent_libudev +netlink_sock_diag.test >> netlink_netfilter +netlink_sock_diag.test >> netlink_protocol -e trace=sendto >> netlink_route +netlink_sock_diag.test >> diff --git a/tests/netlink_kobject_uevent_libudev.c b/tests/netlink_kobject_uevent_libudev.c >> new file mode 100644 >> index 00000000..8f0b2bfa >> --- /dev/null >> +++ b/tests/netlink_kobject_uevent_libudev.c >> @@ -0,0 +1,88 @@ >> +/* >> + * Copyright (c) 2017 JingPiao Chen <che...@gm...> >> + * Copyright (c) 2017 The strace developers. >> + * All rights reserved. >> + * >> + * Redistribution and use in source and binary forms, with or without >> + * modification, are permitted provided that the following conditions >> + * are met: >> + * 1. Redistributions of source code must retain the above copyright >> + * notice, this list of conditions and the following disclaimer. >> + * 2. Redistributions in binary form must reproduce the above copyright >> + * notice, this list of conditions and the following disclaimer in the >> + * documentation and/or other materials provided with the distribution. >> + * 3. The name of the author may not be used to endorse or promote products >> + * derived from this software without specific prior written permission. >> + * >> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR >> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES >> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. >> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, >> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT >> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF >> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> + */ >> + >> +#include "tests.h" >> +#include <stdio.h> >> +#include <string.h> >> +#include <sys/socket.h> >> +#include "netlink.h" >> +#include "netlink_kobject_uevent.h" >> +#include <sys/types.h> >> +#include <unistd.h> >> +#include <arpa/inet.h> >> +#include <fcntl.h> >> + >> +int >> +main(void) >> +{ >> + skip_if_unavailable("/proc/self/fd/"); >> + >> + int fd, ret; >> + struct sockaddr_nl nls; >> + struct udev_monitor_netlink_header uh; >> + >> + memset(&nls, 0, sizeof(nls)); >> + nls.nl_family = AF_NETLINK; >> + nls.nl_pid = getpid(); >> + nls.nl_groups = -1; >> + >> + fd = socket(AF_NETLINK, (SOCK_DGRAM | SOCK_CLOEXEC), >> + NETLINK_KOBJECT_UEVENT); >> + if (fd < 0) >> + perror_msg_and_skip("socket AF_NETLINK"); >> + >> + ret = bind(fd, (struct sockaddr *) &nls, sizeof(nls)); >> + if (ret) >> + perror_msg_and_skip("bind AF_NETLINK"); > > Replace with create_nl_socket(). I need to set nls.nl_pid = getpid(); and nls.nl_groups = -1; to recieve from kernel broadcast so using create_nl_socket in place of this doesn't work. >> + >> + printf("Waiting for events now...\n"); > > Why print this message? This is a RFC patch so to clear what's happening I left this. >> + while (1) { >> + int r = recv(fd, &uh, sizeof(uh), MSG_ERRQUEUE); >> + if (r <= 0) >> + perror_msg_and_skip("recv"); >> + if (!strcmp(uh.prefix, "libudev")) >> + printf("recvfrom(%i, {{prefix=\"%s\"" >> + ", magic=htonl(%#x), header_size=%u" >> + ", properties_off=%u, properties_len=%u" >> + ", filter_subsystem_hash=htonl(%#x)" >> + ", filter_devtype_hash=htonl(%#x)" >> + ", filter_tag_bloom_hi=htonl(%#x)" >> + ", filter_tag_bloom_lo=htonl(%#x)}}, %li" >> + ", MSG_ERRQUEUE, NULL, NULL)\n", >> + fd, uh.prefix, ntohl(uh.magic), uh.header_size, >> + uh.properties_off, uh.properties_len, >> + ntohl(uh.filter_subsystem_hash), >> + ntohl(uh.filter_devtype_hash), >> + ntohl(uh.filter_tag_bloom_hi), >> + ntohl(uh.filter_tag_bloom_lo), sizeof(uh)); >> + } > > I do not understand how this work. travis-ci is fail. This actually waits for kernel uevents and prints decoding of udev_monitor_netlink_header. On strace -e trace=network ./tests/netlink_kobject_uvent_libudev, it shows decoding of libudev header along with printf output which is exactly same. > netlink_kobject_uevent_libudev.gen.test source netlink_sock_diag.test, > which only trace sendto syscall. strace -e trace=sendto udevadm monitor > /dev/null shows no output. NETLINK_KOBJECT_UEVENT protocol is used to receive kernel messages to userspace so sendto syscall is never used in this process. So make check for this test is supposed to fail. Please let me know if I'm wrong somewhere or any other way this test can be improved. Thanks a lot for your review. >> + >> + close(fd); >> + puts("+++ exited with 0 +++"); >> + return 0; >> +} >> diff --git a/tests/pure_executables.list b/tests/pure_executables.list >> index 2f602a93..1ed40d1f 100755 >> --- a/tests/pure_executables.list >> +++ b/tests/pure_executables.list >> @@ -175,6 +175,7 @@ netlink_audit >> netlink_crypto >> netlink_generic >> netlink_kobject_uevent >> +netlink_kobject_uevent_libudev >> netlink_netfilter >> netlink_protocol >> netlink_route >> -- >> 2.14.1 >> > > -- Regards, Harsha Sharma |
From: Chen J. <che...@gm...> - 2018-02-18 03:38:34
|
On 02/16 02:19, Harsha Sharma wrote: > * tests/netlink_kobject_uevent_libudev.c: New file. > * tests/gen_tests.in (netlink_kobject_uevent_libudev): New entry. > * tests/pure_executables.list: Add netlink_kobject_uevent_libudev. > * tests/.gitignore: Likewise. > > Signed-off-by: Harsha Sharma <har...@gm...> > --- > tests/.gitignore | 1 + > tests/gen_tests.in | 1 + > tests/netlink_kobject_uevent_libudev.c | 88 ++++++++++++++++++++++++++++++++++ > tests/pure_executables.list | 1 + > 4 files changed, 91 insertions(+) > create mode 100644 tests/netlink_kobject_uevent_libudev.c > > diff --git a/tests/.gitignore b/tests/.gitignore > index 2541ec24..623b98f8 100644 > --- a/tests/.gitignore > +++ b/tests/.gitignore > @@ -215,6 +215,7 @@ netlink_crypto > netlink_generic > netlink_inet_diag > netlink_kobject_uevent > +netlink_kobject_uevent_libudev > netlink_netfilter > netlink_netlink_diag > netlink_protocol > diff --git a/tests/gen_tests.in b/tests/gen_tests.in > index 18f36408..263479a5 100644 > --- a/tests/gen_tests.in > +++ b/tests/gen_tests.in > @@ -199,6 +199,7 @@ netlink_audit +netlink_sock_diag.test > netlink_crypto +netlink_sock_diag.test > netlink_generic +netlink_sock_diag.test > netlink_kobject_uevent +netlink_sock_diag.test > +netlink_kobject_uevent_libudev +netlink_sock_diag.test > netlink_netfilter +netlink_sock_diag.test > netlink_protocol -e trace=sendto > netlink_route +netlink_sock_diag.test > diff --git a/tests/netlink_kobject_uevent_libudev.c b/tests/netlink_kobject_uevent_libudev.c > new file mode 100644 > index 00000000..8f0b2bfa > --- /dev/null > +++ b/tests/netlink_kobject_uevent_libudev.c > @@ -0,0 +1,88 @@ > +/* > + * Copyright (c) 2017 JingPiao Chen <che...@gm...> > + * Copyright (c) 2017 The strace developers. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * 3. The name of the author may not be used to endorse or promote products > + * derived from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR > + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES > + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. > + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, > + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT > + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include "tests.h" > +#include <stdio.h> > +#include <string.h> > +#include <sys/socket.h> > +#include "netlink.h" > +#include "netlink_kobject_uevent.h" > +#include <sys/types.h> > +#include <unistd.h> > +#include <arpa/inet.h> > +#include <fcntl.h> > + > +int > +main(void) > +{ > + skip_if_unavailable("/proc/self/fd/"); > + > + int fd, ret; > + struct sockaddr_nl nls; > + struct udev_monitor_netlink_header uh; > + > + memset(&nls, 0, sizeof(nls)); > + nls.nl_family = AF_NETLINK; > + nls.nl_pid = getpid(); > + nls.nl_groups = -1; > + > + fd = socket(AF_NETLINK, (SOCK_DGRAM | SOCK_CLOEXEC), > + NETLINK_KOBJECT_UEVENT); > + if (fd < 0) > + perror_msg_and_skip("socket AF_NETLINK"); > + > + ret = bind(fd, (struct sockaddr *) &nls, sizeof(nls)); > + if (ret) > + perror_msg_and_skip("bind AF_NETLINK"); Replace with create_nl_socket(). > + > + printf("Waiting for events now...\n"); Why print this message? > + while (1) { > + int r = recv(fd, &uh, sizeof(uh), MSG_ERRQUEUE); > + if (r <= 0) > + perror_msg_and_skip("recv"); > + if (!strcmp(uh.prefix, "libudev")) > + printf("recvfrom(%i, {{prefix=\"%s\"" > + ", magic=htonl(%#x), header_size=%u" > + ", properties_off=%u, properties_len=%u" > + ", filter_subsystem_hash=htonl(%#x)" > + ", filter_devtype_hash=htonl(%#x)" > + ", filter_tag_bloom_hi=htonl(%#x)" > + ", filter_tag_bloom_lo=htonl(%#x)}}, %li" > + ", MSG_ERRQUEUE, NULL, NULL)\n", > + fd, uh.prefix, ntohl(uh.magic), uh.header_size, > + uh.properties_off, uh.properties_len, > + ntohl(uh.filter_subsystem_hash), > + ntohl(uh.filter_devtype_hash), > + ntohl(uh.filter_tag_bloom_hi), > + ntohl(uh.filter_tag_bloom_lo), sizeof(uh)); > + } I do not understand how this work. travis-ci is fail. netlink_kobject_uevent_libudev.gen.test source netlink_sock_diag.test, which only trace sendto syscall. > + > + close(fd); > + puts("+++ exited with 0 +++"); > + return 0; > +} > diff --git a/tests/pure_executables.list b/tests/pure_executables.list > index 2f602a93..1ed40d1f 100755 > --- a/tests/pure_executables.list > +++ b/tests/pure_executables.list > @@ -175,6 +175,7 @@ netlink_audit > netlink_crypto > netlink_generic > netlink_kobject_uevent > +netlink_kobject_uevent_libudev > netlink_netfilter > netlink_protocol > netlink_route > -- > 2.14.1 > -- Chen Jingpiao |
From: Abhishek T. <era...@gm...> - 2018-02-17 17:31:22
|
please do reply On Thu, Feb 15, 2018 at 7:07 PM, Abhishek Tiwari < era...@gm...> wrote: > Hi, > > I want to work on microproject > > extend -e trace=class syntax with new classes > > > I have gone through mailing list. Is following grouping ok > > {,l,f}setxattr TRACE_SETXATTR TFX > > > -e trace=%setxattr > > Thank you > -- > Abhishek Tiwari > M.Tech (CS), > IIT Kharagpur. > -- Abhishek Tiwari M.Tech (CS), IIT Kharagpur. |
From: Harsha S. <har...@gm...> - 2018-02-17 17:20:45
|
On Wed, Jan 31, 2018 at 11:32 PM, Harsha Sharma <har...@gm...> wrote: > * defs.h (decode_netlink_kobject_uevent): New prototype. > * netlink.c (decode_netlink): Decode family kobject_uevent. > * netlink_kobject_uevent.h: New file. > * netlink_object_uevent.c: New file. > * Makefile.am (strace_SOURCES): Add them. > > Signed-off-by: Harsha Sharma <har...@gm...> Hello, Any comments on this patch ? Please let me know if any changes are required. Thanks for your time :) Regards, Harsha Sharma > --- > Changes in v5: > * print filter_* fields in hex > * print messages after header in correct way > > Changes in v4: > * Minor changes in decode_netlink_kobject_uevent > > Changes in v3: > * Change changelog > * minor changes in decode_netlink_kobject_uevent > * omit irrelevant comments in netlink_kobject_uevent.h > > Changes in v2: > * New file netlink_kobject_uevent.c > * change location of netlink_kobject_uevent.h > * add comments in netlink_kobject_uevent.h > * add new files in Makefile.am > * add func decode_netlink_kobject_uevent in defs.h > * Use macros from print_fields.h instead of tprintf > * minor changes in decode_netlink_kobject_uevent (including name) > > Makefile.am | 2 ++ > defs.h | 3 +++ > netlink.c | 2 +- > netlink_kobject_uevent.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ > netlink_kobject_uevent.h | 17 ++++++++++++ > 5 files changed, 90 insertions(+), 1 deletion(-) > create mode 100644 netlink_kobject_uevent.c > create mode 100644 netlink_kobject_uevent.h > > diff --git a/Makefile.am b/Makefile.am > index 065ab819..20f97b06 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -197,6 +197,8 @@ strace_SOURCES = \ > netlink.c \ > netlink.h \ > netlink_crypto.c \ > + netlink_kobject_uevent.c \ > + netlink_kobject_uevent.h \ > netlink_sock_diag.h \ > netlink_inet_diag.c \ > netlink_netlink_diag.c \ > diff --git a/defs.h b/defs.h > index bbe0ecc9..d80ebc47 100644 > --- a/defs.h > +++ b/defs.h > @@ -685,6 +685,9 @@ DECL_NETLINK(route); > DECL_NETLINK(selinux); > DECL_NETLINK(sock_diag); > > +extern void > +decode_netlink_kobject_uevent(struct tcb *, kernel_ulong_t addr, > + kernel_ulong_t len); > extern int tv_nz(const struct timeval *); > extern int tv_cmp(const struct timeval *, const struct timeval *); > extern double tv_float(const struct timeval *); > diff --git a/netlink.c b/netlink.c > index beb6ea4a..a714d29a 100644 > --- a/netlink.c > +++ b/netlink.c > @@ -629,7 +629,7 @@ decode_netlink(struct tcb *const tcp, > const int family = get_fd_nl_family(tcp, fd); > > if (family == NETLINK_KOBJECT_UEVENT) { > - printstrn(tcp, addr, len); > + decode_netlink_kobject_uevent(tcp, addr, len); > return; > } > > diff --git a/netlink_kobject_uevent.c b/netlink_kobject_uevent.c > new file mode 100644 > index 00000000..1ff7bd63 > --- /dev/null > +++ b/netlink_kobject_uevent.c > @@ -0,0 +1,67 @@ > +/* > + * Copyright (c) 2018 Harsha Sharma <har...@gm...> > + * Copyright (c) 2017 The strace developers. > + * All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * 3. The name of the author may not be used to endorse or promote products > + * derived from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR > + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES > + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. > + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, > + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT > + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include "defs.h" > +#include "print_fields.h" > +#include "netlink_kobject_uevent.h" > + > +#include <arpa/inet.h> > + > +void > +decode_netlink_kobject_uevent(struct tcb *tcp, kernel_ulong_t addr, > + kernel_ulong_t len) > +{ > + struct udev_monitor_netlink_header uh; > + const char *prefix = "libudev"; > + > + if (len < sizeof(uh)) { > + printstrn(tcp, addr, len); > + } else if (!umove_or_printaddr(tcp, addr, &uh)) { > + if (strcmp(uh.prefix, prefix) == 0) { > + PRINT_FIELD_CSTRING("{{", uh, prefix); > + tprintf(", magic=htonl(%#x)", ntohl(uh.magic)); > + PRINT_FIELD_U(", ", uh, header_size); > + PRINT_FIELD_U(", ", uh, properties_off); > + PRINT_FIELD_U(", ", uh, properties_len); > + tprintf(", filter_subsystem_hash=htonl(%#x)", ntohl(uh.filter_subsystem_hash)); > + tprintf(", filter_devtype_hash=htonl(%#x)", ntohl(uh.filter_devtype_hash)); > + tprintf(", filter_tag_bloom_hi=htonl(%#x)", ntohl(uh.filter_tag_bloom_hi)); > + tprintf(", filter_tag_bloom_lo=htonl(%#x)", ntohl(uh.filter_tag_bloom_lo)); > + tprints("}"); > + const size_t offset = CMSG_ALIGN(sizeof(uh)); > + if (len > offset) { > + tprints(", "); > + printstrn(tcp, addr + offset , len - offset); > + } > + tprints("}"); > + } else { > + printstrn(tcp, addr, len); > + } > + > + } > +} > diff --git a/netlink_kobject_uevent.h b/netlink_kobject_uevent.h > new file mode 100644 > index 00000000..5ac57cae > --- /dev/null > +++ b/netlink_kobject_uevent.h > @@ -0,0 +1,17 @@ > +#ifndef STRACE_NETLINK_KOBJECT_UEVENT_H > +#define STRACE_NETLINK_KOBJECT_UEVENT_H > + > +struct udev_monitor_netlink_header { > + /* "libudev" prefix to distinguish libudev and kernel messages */ > + char prefix[8]; > + unsigned int magic; > + unsigned int header_size; > + unsigned int properties_off; > + unsigned int properties_len; > + unsigned int filter_subsystem_hash; > + unsigned int filter_devtype_hash; > + unsigned int filter_tag_bloom_hi; > + unsigned int filter_tag_bloom_lo; > +}; > + > +#endif /* !STRACE_NETLINK_KOBJECT_UEVENT_H */ > -- > 2.14.1 > |
From: SAMEER S. <sen...@gm...> - 2018-02-17 12:00:35
|
Hola Mentors, My name is Sameer Sengar, currently a student in the eighth semester in SHRI MATA VAISHNO DEVI UNIVERSITY, COLLEGE OF ENGINEERING, DEPARTMENT OF COMPUTER SCIENCE & ENGINEERING (INDIA). I am very much inclined towards PHP, JS, Python, C, Shell, and Linux Server. It's very exciting to see Strace in organization list for GSoC 2018. I am quite excited about contributing to the open source community and have a great respect for the community for building projects. Hope to hear your guidance soon. Please find my attached resume (Sameer_Resume.pdf). Cheers, Sameer Sengar Undergraduate Student School Of Computer Sc. & Engineering Shri Mata Vaishno Devi University, Katra Dist- Reasi, 182320 (J&K), INDIA. |
From: Masatake Y. <ya...@re...> - 2018-02-16 19:37:49
|
* defs.h (mmap_cache_search_custom): New function. (mmap_cache_search_fn): New type. * mmap_cache.c (mmap_cache_search_custom): New function. Signed-off-by: Masatake YAMATO <ya...@re...> --- defs.h | 3 +++ mmap_cache.c | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/defs.h b/defs.h index 0bf9a8c7..6736e02b 100644 --- a/defs.h +++ b/defs.h @@ -765,6 +765,9 @@ extern void mmap_cache_delete(struct tcb *tcp, const char *caller); extern enum mmap_cache_rebuild_result mmap_cache_rebuild_if_invalid(struct tcb *tcp, const char *caller); extern struct mmap_cache_t *mmap_cache_search(struct tcb *tcp, unsigned long ip); +typedef bool (* mmap_cache_search_fn) (struct mmap_cache_t *, void *); +extern struct mmap_cache_t *mmap_cache_search_custom(struct tcb *tcp, mmap_cache_search_fn, void *); + static inline int printstrn(struct tcb *tcp, kernel_ulong_t addr, kernel_ulong_t len) { diff --git a/mmap_cache.c b/mmap_cache.c index 33226784..d6271095 100644 --- a/mmap_cache.c +++ b/mmap_cache.c @@ -239,3 +239,15 @@ mmap_cache_search(struct tcb *tcp, unsigned long ip) } return NULL; } + +struct mmap_cache_t * +mmap_cache_search_custom(struct tcb *tcp, mmap_cache_search_fn search_fn, void *data) +{ + int i; + + for (i = 0; i <= (int) tcp->mmap_cache_size; i++) { + if (search_fn (tcp->mmap_cache + i, data)) + return tcp->mmap_cache + i; + } + return NULL; +} -- 2.14.3 |
From: Masatake Y. <ya...@re...> - 2018-02-16 19:37:47
|
* defs.h (struct mmap_cache_t): add major and minor fields. * mmap_cache.c: record device major and minor numbers. Signed-off-by: Masatake YAMATO <ya...@re...> --- defs.h | 3 +++ mmap_cache.c | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/defs.h b/defs.h index 5b42590f..0bf9a8c7 100644 --- a/defs.h +++ b/defs.h @@ -733,12 +733,15 @@ struct mmap_cache_t { * end_addr is 0x7fabbb09f000 * mmap_offset is 0x179000 * protections is MMAP_CACHE_PROT_READABLE|MMAP_CACHE_PROT_EXECUTABLE + * major is 0xfc + * minor is 0x00 * binary_filename is "/lib/libc-2.11.1.so" */ unsigned long start_addr; unsigned long end_addr; unsigned long mmap_offset; unsigned char protections; + unsigned long major, minor; char *binary_filename; }; diff --git a/mmap_cache.c b/mmap_cache.c index bb474b1f..33226784 100644 --- a/mmap_cache.c +++ b/mmap_cache.c @@ -83,12 +83,15 @@ build_mmap_cache(struct tcb *tcp) char write_bit; char exec_bit; char shared_bit; + unsigned long major, minor; char binary_path[sizeof(buffer)]; - if (sscanf(buffer, "%lx-%lx %c%c%c%c %lx %*x:%*x %*d %[^\n]", + if (sscanf(buffer, "%lx-%lx %c%c%c%c %lx %lx:%lx %*d %[^\n]", &start_addr, &end_addr, &read_bit, &write_bit, &exec_bit, &shared_bit, - &mmap_offset, binary_path) != 8) + &mmap_offset, + &major, &minor, + binary_path) != 10) continue; /* skip mappings having unknown protection */ @@ -144,6 +147,8 @@ build_mmap_cache(struct tcb *tcp) | ((exec_bit == 'x')? MMAP_CACHE_PROT_EXECUTABLE: 0) | ((shared_bit == 's')? MMAP_CACHE_PROT_SHARED : 0) ); + entry->major = major; + entry->minor = minor; entry->binary_filename = xstrdup(binary_path); tcp->mmap_cache_size++; } -- 2.14.3 |
From: Masatake Y. <ya...@re...> - 2018-02-16 19:37:45
|
mmap_cache was enabled indirectly via unwind feature. Now mmap_cache can be used other part of strace. So the way to enable mmap_cache directly is needed. * mmap_cache (mmap_cache_enable, mmap_cache_is_enabled): New functions. (use_mmap_cache): New file local variable. * syscall.c (syscall_exiting_decode): Use mmap_cache_is_enabled. * unwind.c (unwind_init): Call mmap_cache_enable. Signed-off-by: Masatake YAMATO <ya...@re...> --- defs.h | 2 ++ mmap_cache.c | 11 +++++++++++ syscall.c | 4 +--- unwind.c | 1 + 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/defs.h b/defs.h index f49d6f56..5b42590f 100644 --- a/defs.h +++ b/defs.h @@ -755,6 +755,8 @@ enum mmap_cache_rebuild_result { MMAP_CACHE_REBUILD_RENEWED, }; +extern void mmap_cache_enable(void); +extern bool mmap_cache_is_enabled(void); extern void mmap_cache_invalidate(struct tcb *tcp); extern void mmap_cache_delete(struct tcb *tcp, const char *caller); extern enum mmap_cache_rebuild_result mmap_cache_rebuild_if_invalid(struct tcb *tcp, const char *caller); diff --git a/mmap_cache.c b/mmap_cache.c index a3367027..bb474b1f 100644 --- a/mmap_cache.c +++ b/mmap_cache.c @@ -41,6 +41,17 @@ #endif static unsigned int mmap_cache_generation; +static bool use_mmap_cache; + +extern void mmap_cache_enable(void) +{ + use_mmap_cache = true; +} + +extern bool mmap_cache_is_enabled(void) +{ + return use_mmap_cache; +} /* * caching of /proc/ID/maps for each process to speed up stack tracing diff --git a/syscall.c b/syscall.c index 66d91022..c3d5f66e 100644 --- a/syscall.c +++ b/syscall.c @@ -728,12 +728,10 @@ syscall_exiting_decode(struct tcb *tcp, struct timeval *ptv) if ((Tflag || cflag) && !(filtered(tcp) || hide_log(tcp))) gettimeofday(ptv, NULL); -#ifdef USE_LIBUNWIND - if (stack_trace_enabled) { + if (mmap_cache_is_enabled()) { if (tcp->s_ent->sys_flags & STACKTRACE_INVALIDATE_CACHE) mmap_cache_invalidate(tcp); } -#endif if (filtered(tcp) || hide_log(tcp)) return 0; diff --git a/unwind.c b/unwind.c index 3457ec84..ea7ae353 100644 --- a/unwind.c +++ b/unwind.c @@ -74,6 +74,7 @@ unwind_init(void) if (!libunwind_as) error_msg_and_die("failed to create address space for stack tracing"); unw_set_caching_policy(libunwind_as, UNW_CACHE_GLOBAL); + mmap_cache_enable(); } void -- 2.14.3 |
From: Masatake Y. <ya...@re...> - 2018-02-16 19:37:43
|
Destructor of unwind related code called mmap_cache_delete function. However, now, other parts than unwind.c can use mmap cache. So mmap_cache_delete, the cache destructor should be called separately from unwind related code. * strace.c (droptcb): Call mmap_cache_delete. * unwind.c (unwind_tcb_fin): Don't call mmap_cache_delete. Signed-off-by: Masatake YAMATO <ya...@re...> --- strace.c | 2 ++ unwind.c | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/strace.c b/strace.c index 10579f66..794e9a0d 100644 --- a/strace.c +++ b/strace.c @@ -803,6 +803,8 @@ droptcb(struct tcb *tcp) } #endif + mmap_cache_delete(tcp, __func__); + nprocs--; debug_msg("dropped tcb for pid %d, %d remain", tcp->pid, nprocs); diff --git a/unwind.c b/unwind.c index ef98fc99..3457ec84 100644 --- a/unwind.c +++ b/unwind.c @@ -98,8 +98,6 @@ unwind_tcb_fin(struct tcb *tcp) free(tcp->queue); tcp->queue = NULL; - mmap_cache_delete(tcp, __func__); - _UPT_destroy(tcp->libunwind_ui); tcp->libunwind_ui = NULL; } -- 2.14.3 |
From: Masatake Y. <ya...@re...> - 2018-02-16 19:37:41
|
To make mmap_cache reusable, this change records protection bits of mmap entry. * defs.h (MMAP_CACHE_PROT_*): New enums. * mmap_cache.c (build_mmpa_cache): Don't ignore entries that are not executable. Just record the protection bits here. * unwind.c (print_stack_frame): Ignore entries that are not executable here. Signed-off-by: Masatake YAMATO <ya...@re...> --- defs.h | 9 +++++++++ mmap_cache.c | 27 ++++++++++++++++++++++----- unwind.c | 4 +++- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/defs.h b/defs.h index 1081a962..f49d6f56 100644 --- a/defs.h +++ b/defs.h @@ -732,14 +732,23 @@ struct mmap_cache_t { * start_addr is 0x7fabbb09b000 * end_addr is 0x7fabbb09f000 * mmap_offset is 0x179000 + * protections is MMAP_CACHE_PROT_READABLE|MMAP_CACHE_PROT_EXECUTABLE * binary_filename is "/lib/libc-2.11.1.so" */ unsigned long start_addr; unsigned long end_addr; unsigned long mmap_offset; + unsigned char protections; char *binary_filename; }; +enum mmap_cache_protection { + MMAP_CACHE_PROT_READABLE = 1 << 0, + MMAP_CACHE_PROT_WRITABLE = 1 << 1, + MMAP_CACHE_PROT_EXECUTABLE = 1 << 2, + MMAP_CACHE_PROT_SHARED = 1 << 3, +}; + enum mmap_cache_rebuild_result { MMAP_CACHE_REBUILD_NOCACHE, MMAP_CACHE_REBUILD_READY, diff --git a/mmap_cache.c b/mmap_cache.c index 0c6e2b7e..a3367027 100644 --- a/mmap_cache.c +++ b/mmap_cache.c @@ -68,16 +68,26 @@ build_mmap_cache(struct tcb *tcp) while (fgets(buffer, sizeof(buffer), fp) != NULL) { struct mmap_cache_t *entry; unsigned long start_addr, end_addr, mmap_offset; + char read_bit; + char write_bit; char exec_bit; + char shared_bit; char binary_path[sizeof(buffer)]; - if (sscanf(buffer, "%lx-%lx %*c%*c%c%*c %lx %*x:%*x %*d %[^\n]", - &start_addr, &end_addr, &exec_bit, - &mmap_offset, binary_path) != 5) + if (sscanf(buffer, "%lx-%lx %c%c%c%c %lx %*x:%*x %*d %[^\n]", + &start_addr, &end_addr, + &read_bit, &write_bit, &exec_bit, &shared_bit, + &mmap_offset, binary_path) != 8) continue; - /* ignore mappings that have no PROT_EXEC bit set */ - if (exec_bit != 'x') + /* skip mappings having unknown protection */ + if (!(read_bit == '-' || read_bit == 'r')) + continue; + if (!(write_bit == '-' || write_bit == 'w')) + continue; + if (!(exec_bit == '-' || exec_bit == 'x')) + continue; + if (!(shared_bit == 'p' || shared_bit == 's')) continue; if (end_addr < start_addr) { @@ -116,6 +126,13 @@ build_mmap_cache(struct tcb *tcp) entry->start_addr = start_addr; entry->end_addr = end_addr; entry->mmap_offset = mmap_offset; + entry->protections = ( + 0 + | ((read_bit == 'r')? MMAP_CACHE_PROT_READABLE : 0) + | ((write_bit == 'w')? MMAP_CACHE_PROT_WRITABLE : 0) + | ((exec_bit == 'x')? MMAP_CACHE_PROT_EXECUTABLE: 0) + | ((shared_bit == 's')? MMAP_CACHE_PROT_SHARED : 0) + ); entry->binary_filename = xstrdup(binary_path); tcp->mmap_cache_size++; } diff --git a/unwind.c b/unwind.c index 56a7b9ce..ef98fc99 100644 --- a/unwind.c +++ b/unwind.c @@ -139,7 +139,9 @@ print_stack_frame(struct tcb *tcp, } cur_mmap_cache = mmap_cache_search(tcp, ip); - if (cur_mmap_cache) { + if (cur_mmap_cache + /* ignore mappings that have no PROT_EXEC bit set */ + && (cur_mmap_cache->protections & MMAP_CACHE_PROT_EXECUTABLE)) { unsigned long true_offset; unw_word_t function_offset; -- 2.14.3 |
From: Masatake Y. <ya...@re...> - 2018-02-16 19:37:39
|
print_stack_frame function in unwind.c searches a mmap entry from mmap caches. The found entry is used for unwinding. However, a function searching a mmap entry may be useful for other purpose than unwinding. This change re-factors the function; code for searching an entry is now defiend as a stand-alone function named mmap_cache_search. * defs.h (mmap_cache_search): New function derived from print_stack_frame. * mmap_cached.c (mmap_cache_search): The implementation of the new function. * unwind.c (print_stack_frame): Use the new function. Signed-off-by: Masatake YAMATO <ya...@re...> --- defs.h | 1 + mmap_cache.c | 23 +++++++++++++++++++++++ unwind.c | 53 ++++++++++++++++++++--------------------------------- 3 files changed, 44 insertions(+), 33 deletions(-) diff --git a/defs.h b/defs.h index eb3aee4d..1081a962 100644 --- a/defs.h +++ b/defs.h @@ -749,6 +749,7 @@ enum mmap_cache_rebuild_result { extern void mmap_cache_invalidate(struct tcb *tcp); extern void mmap_cache_delete(struct tcb *tcp, const char *caller); extern enum mmap_cache_rebuild_result mmap_cache_rebuild_if_invalid(struct tcb *tcp, const char *caller); +extern struct mmap_cache_t *mmap_cache_search(struct tcb *tcp, unsigned long ip); static inline int printstrn(struct tcb *tcp, kernel_ulong_t addr, kernel_ulong_t len) diff --git a/mmap_cache.c b/mmap_cache.c index eadfe283..0c6e2b7e 100644 --- a/mmap_cache.c +++ b/mmap_cache.c @@ -183,3 +183,26 @@ mmap_cache_invalidate(struct tcb *tcp) mmap_cache_generation, tcp, tcp->mmap_cache); } + +struct mmap_cache_t * +mmap_cache_search(struct tcb *tcp, unsigned long ip) +{ + int lower = 0; + int upper = (int) tcp->mmap_cache_size - 1; + + while (lower <= upper) { + struct mmap_cache_t *cur_mmap_cache; + int mid = (upper + lower) / 2; + + cur_mmap_cache = &tcp->mmap_cache[mid]; + + if (ip >= cur_mmap_cache->start_addr && + ip < cur_mmap_cache->end_addr) + return cur_mmap_cache; + else if (ip < cur_mmap_cache->start_addr) + upper = mid - 1; + else + lower = mid + 1; + } + return NULL; +} diff --git a/unwind.c b/unwind.c index 77fb2378..56a7b9ce 100644 --- a/unwind.c +++ b/unwind.c @@ -131,53 +131,40 @@ print_stack_frame(struct tcb *tcp, size_t *symbol_name_size) { unw_word_t ip; - int lower = 0; - int upper = (int) tcp->mmap_cache_size - 1; + struct mmap_cache_t *cur_mmap_cache; if (unw_get_reg(cursor, UNW_REG_IP, &ip) < 0) { perror_msg("Can't walk the stack of process %d", tcp->pid); return -1; } - while (lower <= upper) { - struct mmap_cache_t *cur_mmap_cache; - int mid = (upper + lower) / 2; - - cur_mmap_cache = &tcp->mmap_cache[mid]; - - if (ip >= cur_mmap_cache->start_addr && - ip < cur_mmap_cache->end_addr) { - unsigned long true_offset; - unw_word_t function_offset; - - get_symbol_name(cursor, symbol_name, symbol_name_size, - &function_offset); - true_offset = ip - cur_mmap_cache->start_addr + - cur_mmap_cache->mmap_offset; + cur_mmap_cache = mmap_cache_search(tcp, ip); + if (cur_mmap_cache) { + unsigned long true_offset; + unw_word_t function_offset; + get_symbol_name(cursor, symbol_name, symbol_name_size, + &function_offset); + true_offset = ip - cur_mmap_cache->start_addr + + cur_mmap_cache->mmap_offset; #ifdef USE_DEMANGLE - char *demangled_name = - cplus_demangle(*symbol_name, - DMGL_AUTO | DMGL_PARAMS); + char *demangled_name = + cplus_demangle(*symbol_name, + DMGL_AUTO | DMGL_PARAMS); #endif - - call_action(data, - cur_mmap_cache->binary_filename, + call_action(data, + cur_mmap_cache->binary_filename, #ifdef USE_DEMANGLE - demangled_name ? demangled_name : + demangled_name ? demangled_name : #endif - *symbol_name, - function_offset, - true_offset); + *symbol_name, + function_offset, + true_offset); #ifdef USE_DEMANGLE - free(demangled_name); + free(demangled_name); #endif - return 0; - } else if (ip < cur_mmap_cache->start_addr) - upper = mid - 1; - else - lower = mid + 1; + return 0; } /* -- 2.14.3 |
From: Masatake Y. <ya...@re...> - 2018-02-16 19:37:36
|
For making mmap cache code reusable from other areas in strace than unwind, mmap cache related code and unwind related code should be separated. This change moves the most of all mmap cache code in unwind.c to mmap_cache.c, a new file. * Makefile.am (mmap_cache.c): New file. * defs.h (mmap_cache_invalidate): Renamed from unwind_cache_invalidate. (mmap_cache_delete): Renamed from delete_mmap_cache and extern'ed. (mmap_cache_rebuild_if_invalid): Renamed from unwind_cache_invalidate and extern'ed. (struct mmap_cache_t): Move from unwind.c. (enum mmap_cache_rebuild_result): Move from unwind.c. * unwind.c: remove mmap_cache implementation. * syscall.c: call a function for invalidating mmap cache with new name. Signed-off-by: Masatake YAMATO <ya...@re...> --- Makefile.am | 1 + defs.h | 31 +++++++++- mmap_cache.c | 185 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ syscall.c | 2 +- unwind.c | 188 +---------------------------------------------------------- 5 files changed, 220 insertions(+), 187 deletions(-) create mode 100644 mmap_cache.c diff --git a/Makefile.am b/Makefile.am index db9ad6e8..3f7025f1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -185,6 +185,7 @@ strace_SOURCES = \ membarrier.c \ memfd_create.c \ mknod.c \ + mmap_cache.c \ mmsghdr.c \ mount.c \ mpers_type.h \ diff --git a/defs.h b/defs.h index de55d3b7..eb3aee4d 100644 --- a/defs.h +++ b/defs.h @@ -716,11 +716,40 @@ extern void tv_div(struct timeval *, const struct timeval *, int); extern void unwind_init(void); extern void unwind_tcb_init(struct tcb *); extern void unwind_tcb_fin(struct tcb *); -extern void unwind_cache_invalidate(struct tcb *); extern void unwind_print_stacktrace(struct tcb *); extern void unwind_capture_stacktrace(struct tcb *); #endif +/* + * Keep a sorted array of cache entries, + * so that we can binary search through it. + */ +struct mmap_cache_t { + /** + * example entry: + * 7fabbb09b000-7fabbb09f000 r-xp 00179000 fc:00 1180246 /lib/libc-2.11.1.so + * + * start_addr is 0x7fabbb09b000 + * end_addr is 0x7fabbb09f000 + * mmap_offset is 0x179000 + * binary_filename is "/lib/libc-2.11.1.so" + */ + unsigned long start_addr; + unsigned long end_addr; + unsigned long mmap_offset; + char *binary_filename; +}; + +enum mmap_cache_rebuild_result { + MMAP_CACHE_REBUILD_NOCACHE, + MMAP_CACHE_REBUILD_READY, + MMAP_CACHE_REBUILD_RENEWED, +}; + +extern void mmap_cache_invalidate(struct tcb *tcp); +extern void mmap_cache_delete(struct tcb *tcp, const char *caller); +extern enum mmap_cache_rebuild_result mmap_cache_rebuild_if_invalid(struct tcb *tcp, const char *caller); + static inline int printstrn(struct tcb *tcp, kernel_ulong_t addr, kernel_ulong_t len) { diff --git a/mmap_cache.c b/mmap_cache.c new file mode 100644 index 00000000..eadfe283 --- /dev/null +++ b/mmap_cache.c @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2013 Luca Clementi <luc...@gm...> + * Copyright (c) 2013-2018 The strace developers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "defs.h" +#include <limits.h> + +#include "xstring.h" + +#ifdef _LARGEFILE64_SOURCE +# ifdef HAVE_FOPEN64 +# define fopen_for_input fopen64 +# else +# define fopen_for_input fopen +# endif +#else +# define fopen_for_input fopen +#endif + +static unsigned int mmap_cache_generation; + +/* + * caching of /proc/ID/maps for each process to speed up stack tracing + * + * The cache must be refreshed after syscalls that affect memory mappings, + * e.g. mmap, mprotect, munmap, execve. + */ +static void +build_mmap_cache(struct tcb *tcp) +{ + FILE *fp; + struct mmap_cache_t *cache_head = NULL; + /* start with a small dynamically-allocated array and then expand it */ + size_t cur_array_size = 0; + char filename[sizeof("/proc/4294967296/maps")]; + char buffer[PATH_MAX + 80]; + + xsprintf(filename, "/proc/%u/maps", tcp->pid); + fp = fopen_for_input(filename, "r"); + if (!fp) { + perror_msg("fopen: %s", filename); + return; + } + + while (fgets(buffer, sizeof(buffer), fp) != NULL) { + struct mmap_cache_t *entry; + unsigned long start_addr, end_addr, mmap_offset; + char exec_bit; + char binary_path[sizeof(buffer)]; + + if (sscanf(buffer, "%lx-%lx %*c%*c%c%*c %lx %*x:%*x %*d %[^\n]", + &start_addr, &end_addr, &exec_bit, + &mmap_offset, binary_path) != 5) + continue; + + /* ignore mappings that have no PROT_EXEC bit set */ + if (exec_bit != 'x') + continue; + + if (end_addr < start_addr) { + error_msg("%s: unrecognized file format", filename); + break; + } + + /* + * sanity check to make sure that we're storing + * non-overlapping regions in ascending order + */ + if (tcp->mmap_cache_size > 0) { + entry = &cache_head[tcp->mmap_cache_size - 1]; + if (entry->start_addr == start_addr && + entry->end_addr == end_addr) { + /* duplicate entry, e.g. [vsyscall] */ + continue; + } + if (start_addr <= entry->start_addr || + start_addr < entry->end_addr) { + debug_msg("%s: overlapping memory region: " + "\"%s\" [%08lx-%08lx] overlaps with " + "\"%s\" [%08lx-%08lx]", + filename, binary_path, start_addr, + end_addr, entry->binary_filename, + entry->start_addr, entry->end_addr); + continue; + } + } + + if (tcp->mmap_cache_size >= cur_array_size) + cache_head = xgrowarray(cache_head, &cur_array_size, + sizeof(*cache_head)); + + entry = &cache_head[tcp->mmap_cache_size]; + entry->start_addr = start_addr; + entry->end_addr = end_addr; + entry->mmap_offset = mmap_offset; + entry->binary_filename = xstrdup(binary_path); + tcp->mmap_cache_size++; + } + fclose(fp); + tcp->mmap_cache = cache_head; + tcp->mmap_cache_generation = mmap_cache_generation; + + debug_func_msg("tgen=%u, ggen=%u, tcp=%p, cache=%p", + tcp->mmap_cache_generation, + mmap_cache_generation, + tcp, tcp->mmap_cache); +} + +/* deleting the cache */ +extern void +mmap_cache_delete(struct tcb *tcp, const char *caller) +{ + unsigned int i; + + debug_func_msg("tgen=%u, ggen=%u, tcp=%p, cache=%p, caller=%s", + tcp->mmap_cache_generation, + mmap_cache_generation, + tcp, tcp->mmap_cache, caller); + + for (i = 0; i < tcp->mmap_cache_size; i++) { + free(tcp->mmap_cache[i].binary_filename); + tcp->mmap_cache[i].binary_filename = NULL; + } + free(tcp->mmap_cache); + tcp->mmap_cache = NULL; + tcp->mmap_cache_size = 0; +} + +extern enum mmap_cache_rebuild_result +mmap_cache_rebuild_if_invalid(struct tcb *tcp, const char *caller) +{ + enum mmap_cache_rebuild_result r = MMAP_CACHE_REBUILD_READY; + if ((tcp->mmap_cache_generation != mmap_cache_generation) + && tcp->mmap_cache) + mmap_cache_delete(tcp, caller); + + if (!tcp->mmap_cache) { + r = MMAP_CACHE_REBUILD_RENEWED; + build_mmap_cache(tcp); + } + + if (!(tcp->mmap_cache && tcp->mmap_cache_size)) + r = MMAP_CACHE_REBUILD_NOCACHE; + + return r; +} + +void +mmap_cache_invalidate(struct tcb *tcp) +{ +#if SUPPORTED_PERSONALITIES > 1 + if (tcp->currpers != DEFAULT_PERSONALITY) { + /* disable stack trace */ + return; + } +#endif + mmap_cache_generation++; + debug_func_msg("tgen=%u, ggen=%u, tcp=%p, cache=%p", + tcp->mmap_cache_generation, + mmap_cache_generation, + tcp, tcp->mmap_cache); +} diff --git a/syscall.c b/syscall.c index cb9bce1e..66d91022 100644 --- a/syscall.c +++ b/syscall.c @@ -731,7 +731,7 @@ syscall_exiting_decode(struct tcb *tcp, struct timeval *ptv) #ifdef USE_LIBUNWIND if (stack_trace_enabled) { if (tcp->s_ent->sys_flags & STACKTRACE_INVALIDATE_CACHE) - unwind_cache_invalidate(tcp); + mmap_cache_invalidate(tcp); } #endif diff --git a/unwind.c b/unwind.c index c171844c..77fb2378 100644 --- a/unwind.c +++ b/unwind.c @@ -26,7 +26,6 @@ */ #include "defs.h" -#include <limits.h> #include <libunwind-ptrace.h> #ifdef USE_DEMANGLE @@ -37,38 +36,6 @@ # endif #endif -#include "xstring.h" - -#ifdef _LARGEFILE64_SOURCE -# ifdef HAVE_FOPEN64 -# define fopen_for_input fopen64 -# else -# define fopen_for_input fopen -# endif -#else -# define fopen_for_input fopen -#endif - -/* - * Keep a sorted array of cache entries, - * so that we can binary search through it. - */ -struct mmap_cache_t { - /** - * example entry: - * 7fabbb09b000-7fabbb09f000 r-xp 00179000 fc:00 1180246 /lib/libc-2.11.1.so - * - * start_addr is 0x7fabbb09b000 - * end_addr is 0x7fabbb09f000 - * mmap_offset is 0x179000 - * binary_filename is "/lib/libc-2.11.1.so" - */ - unsigned long start_addr; - unsigned long end_addr; - unsigned long mmap_offset; - char *binary_filename; -}; - /* * Type used in stacktrace walker */ @@ -95,10 +62,8 @@ struct queue_t { }; static void queue_print(struct queue_t *queue); -static void delete_mmap_cache(struct tcb *tcp, const char *caller); static unw_addr_space_t libunwind_as; -static unsigned int mmap_cache_generation; static const char asprintf_error_str[] = "???"; @@ -133,159 +98,12 @@ unwind_tcb_fin(struct tcb *tcp) free(tcp->queue); tcp->queue = NULL; - delete_mmap_cache(tcp, __func__); + mmap_cache_delete(tcp, __func__); _UPT_destroy(tcp->libunwind_ui); tcp->libunwind_ui = NULL; } -/* - * caching of /proc/ID/maps for each process to speed up stack tracing - * - * The cache must be refreshed after syscalls that affect memory mappings, - * e.g. mmap, mprotect, munmap, execve. - */ -static void -build_mmap_cache(struct tcb *tcp) -{ - FILE *fp; - struct mmap_cache_t *cache_head = NULL; - size_t cur_array_size = 0; - char filename[sizeof("/proc/4294967296/maps")]; - char buffer[PATH_MAX + 80]; - - xsprintf(filename, "/proc/%u/maps", tcp->pid); - fp = fopen_for_input(filename, "r"); - if (!fp) { - perror_msg("fopen: %s", filename); - return; - } - - while (fgets(buffer, sizeof(buffer), fp) != NULL) { - struct mmap_cache_t *entry; - unsigned long start_addr, end_addr, mmap_offset; - char exec_bit; - char binary_path[sizeof(buffer)]; - - if (sscanf(buffer, "%lx-%lx %*c%*c%c%*c %lx %*x:%*x %*d %[^\n]", - &start_addr, &end_addr, &exec_bit, - &mmap_offset, binary_path) != 5) - continue; - - /* ignore mappings that have no PROT_EXEC bit set */ - if (exec_bit != 'x') - continue; - - if (end_addr < start_addr) { - error_msg("%s: unrecognized file format", filename); - break; - } - - /* - * sanity check to make sure that we're storing - * non-overlapping regions in ascending order - */ - if (tcp->mmap_cache_size > 0) { - entry = &cache_head[tcp->mmap_cache_size - 1]; - if (entry->start_addr == start_addr && - entry->end_addr == end_addr) { - /* duplicate entry, e.g. [vsyscall] */ - continue; - } - if (start_addr <= entry->start_addr || - start_addr < entry->end_addr) { - debug_msg("%s: overlapping memory region: " - "\"%s\" [%08lx-%08lx] overlaps with " - "\"%s\" [%08lx-%08lx]", - filename, binary_path, start_addr, - end_addr, entry->binary_filename, - entry->start_addr, entry->end_addr); - continue; - } - } - - if (tcp->mmap_cache_size >= cur_array_size) - cache_head = xgrowarray(cache_head, &cur_array_size, - sizeof(*cache_head)); - - entry = &cache_head[tcp->mmap_cache_size]; - entry->start_addr = start_addr; - entry->end_addr = end_addr; - entry->mmap_offset = mmap_offset; - entry->binary_filename = xstrdup(binary_path); - tcp->mmap_cache_size++; - } - fclose(fp); - tcp->mmap_cache = cache_head; - tcp->mmap_cache_generation = mmap_cache_generation; - - debug_func_msg("tgen=%u, ggen=%u, tcp=%p, cache=%p", - tcp->mmap_cache_generation, - mmap_cache_generation, - tcp, tcp->mmap_cache); -} - -/* deleting the cache */ -static void -delete_mmap_cache(struct tcb *tcp, const char *caller) -{ - unsigned int i; - - debug_func_msg("tgen=%u, ggen=%u, tcp=%p, cache=%p, caller=%s", - tcp->mmap_cache_generation, - mmap_cache_generation, - tcp, tcp->mmap_cache, caller); - - for (i = 0; i < tcp->mmap_cache_size; i++) { - free(tcp->mmap_cache[i].binary_filename); - tcp->mmap_cache[i].binary_filename = NULL; - } - free(tcp->mmap_cache); - tcp->mmap_cache = NULL; - tcp->mmap_cache_size = 0; -} - -enum mmap_cache_rebuild_result { - MMAP_CACHE_REBUILD_NOCACHE, - MMAP_CACHE_REBUILD_READY, - MMAP_CACHE_REBUILD_RENEWED, -}; - -static enum mmap_cache_rebuild_result -rebuild_cache_if_invalid(struct tcb *tcp, const char *caller) -{ - enum mmap_cache_rebuild_result r = MMAP_CACHE_REBUILD_READY; - if ((tcp->mmap_cache_generation != mmap_cache_generation) - && tcp->mmap_cache) - delete_mmap_cache(tcp, caller); - - if (!tcp->mmap_cache) { - r = MMAP_CACHE_REBUILD_RENEWED; - build_mmap_cache(tcp); - } - - if (!(tcp->mmap_cache && tcp->mmap_cache_size)) - r = MMAP_CACHE_REBUILD_NOCACHE; - - return r; -} - -void -unwind_cache_invalidate(struct tcb *tcp) -{ -#if SUPPORTED_PERSONALITIES > 1 - if (tcp->currpers != DEFAULT_PERSONALITY) { - /* disable stack trace */ - return; - } -#endif - mmap_cache_generation++; - debug_func_msg("tgen=%u, ggen=%u, tcp=%p, cache=%p", - tcp->mmap_cache_generation, - mmap_cache_generation, - tcp, tcp->mmap_cache); -} - static void get_symbol_name(unw_cursor_t *cursor, char **name, size_t *size, unw_word_t *offset) @@ -588,7 +406,7 @@ unwind_print_stacktrace(struct tcb *tcp) if (tcp->queue->head) { debug_func_msg("head: tcp=%p, queue=%p", tcp, tcp->queue->head); queue_print(tcp->queue); - } else switch (rebuild_cache_if_invalid(tcp, __func__)) { + } else switch (mmap_cache_rebuild_if_invalid(tcp, __func__)) { case MMAP_CACHE_REBUILD_RENEWED: unw_flush_cache(libunwind_as, 0, 0); /* Fall through */ @@ -617,7 +435,7 @@ unwind_capture_stacktrace(struct tcb *tcp) if (tcp->queue->head) error_msg_and_die("bug: unprinted entries in queue"); - switch (rebuild_cache_if_invalid(tcp, __func__)) { + switch (mmap_cache_rebuild_if_invalid(tcp, __func__)) { case MMAP_CACHE_REBUILD_RENEWED: unw_flush_cache(libunwind_as, 0, 0); /* Fall through */ -- 2.14.3 |
From: Masatake Y. <ya...@re...> - 2018-02-16 19:37:33
|
For making mmap cache code reusable from other areas in strace than unwind, mmap cache related code and unwind related code should be separated. This change is one of the steps for the separation. It moves unw_flush_cache function call from the core of mmap cache code to upper level code. * unwind.c (MMAP_CACHE_REBUILD_*): New enum. (rebuild_cache_if_invalid): Return MMAP_CACHE_REBUILD_* instead of bool value. (build_mmap_cache): Don't call unw_flush_cache here. (unwind_print_stacktrace, unwind_capture_stacktrace): Call unw_flush_cache here instead. Signed-off-by: Masatake YAMATO <ya...@re...> --- unwind.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/unwind.c b/unwind.c index ecda1842..c171844c 100644 --- a/unwind.c +++ b/unwind.c @@ -154,8 +154,6 @@ build_mmap_cache(struct tcb *tcp) char filename[sizeof("/proc/4294967296/maps")]; char buffer[PATH_MAX + 80]; - unw_flush_cache(libunwind_as, 0, 0); - xsprintf(filename, "/proc/%u/maps", tcp->pid); fp = fopen_for_input(filename, "r"); if (!fp) { @@ -247,17 +245,29 @@ delete_mmap_cache(struct tcb *tcp, const char *caller) tcp->mmap_cache_size = 0; } -static bool +enum mmap_cache_rebuild_result { + MMAP_CACHE_REBUILD_NOCACHE, + MMAP_CACHE_REBUILD_READY, + MMAP_CACHE_REBUILD_RENEWED, +}; + +static enum mmap_cache_rebuild_result rebuild_cache_if_invalid(struct tcb *tcp, const char *caller) { + enum mmap_cache_rebuild_result r = MMAP_CACHE_REBUILD_READY; if ((tcp->mmap_cache_generation != mmap_cache_generation) && tcp->mmap_cache) delete_mmap_cache(tcp, caller); - if (!tcp->mmap_cache) + if (!tcp->mmap_cache) { + r = MMAP_CACHE_REBUILD_RENEWED; build_mmap_cache(tcp); + } + + if (!(tcp->mmap_cache && tcp->mmap_cache_size)) + r = MMAP_CACHE_REBUILD_NOCACHE; - return tcp->mmap_cache && tcp->mmap_cache_size; + return r; } void @@ -578,9 +588,17 @@ unwind_print_stacktrace(struct tcb *tcp) if (tcp->queue->head) { debug_func_msg("head: tcp=%p, queue=%p", tcp, tcp->queue->head); queue_print(tcp->queue); - } else if (rebuild_cache_if_invalid(tcp, __func__)) { - debug_func_msg("walk: tcp=%p, queue=%p", tcp, tcp->queue->head); - stacktrace_walk(tcp, print_call_cb, print_error_cb, NULL); + } else switch (rebuild_cache_if_invalid(tcp, __func__)) { + case MMAP_CACHE_REBUILD_RENEWED: + unw_flush_cache(libunwind_as, 0, 0); + /* Fall through */ + case MMAP_CACHE_REBUILD_READY: + debug_func_msg("walk: tcp=%p, queue=%p", tcp, tcp->queue->head); + stacktrace_walk(tcp, print_call_cb, print_error_cb, NULL); + break; + default: + /* Do nothing */ + ; } } @@ -599,9 +617,17 @@ unwind_capture_stacktrace(struct tcb *tcp) if (tcp->queue->head) error_msg_and_die("bug: unprinted entries in queue"); - if (rebuild_cache_if_invalid(tcp, __func__)) { + switch (rebuild_cache_if_invalid(tcp, __func__)) { + case MMAP_CACHE_REBUILD_RENEWED: + unw_flush_cache(libunwind_as, 0, 0); + /* Fall through */ + case MMAP_CACHE_REBUILD_READY: stacktrace_walk(tcp, queue_put_call, queue_put_error, tcp->queue); debug_func_msg("tcp=%p, queue=%p", tcp, tcp->queue->head); + break; + default: + /* Do nothing */ + ; } } -- 2.14.3 |