"Dmitry V. Levin" <ldv-u2l5PoMzF/vg9huczpv...@public.gmane.org> writes:

> On Thu, Mar 12, 2015 at 11:13:49AM +0100, Andreas Schwab wrote:
>> "Dmitry V. Levin" 
>> <ldv-u2l5PoMzF/vg9huczpvpmw-xmd5yjdbdmrexy1tmh2...@public.gmane.org> writes:
>> > On Wed, Mar 11, 2015 at 01:07:15PM +0100, Andreas Schwab wrote:
>> >> On architectures where the semctl call is implemented by the ipc syscall
>> >> the glibc wrapper passes a pointer to a local variable, so the value of
>> >> the fourth argument is unknown.
>> >
>> > Wouldn't it be better to fix the parser, e.g.
>> >
>> > --- a/ipc.c
>> > +++ b/ipc.c
>> > @@ -281,7 +281,16 @@ int sys_semctl(struct tcb *tcp)
>> >    if (entering(tcp)) {
>> >            tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
>> >            PRINTCTL(semctl_flags, tcp->u_arg[2], "SEM_???");
>> > -          tprintf(", %#lx", tcp->u_arg[3]);
>> > +          tprints(", ");
>> > +          if (indirect_ipccall(tcp)) {
>> > +                  if (current_wordsize == sizeof(int)) {
>> > +                          printnum_int(tcp, tcp->u_arg[3], "%#x");
>> > +                  } else {
>> > +                          printnum_long(tcp, tcp->u_arg[3], "%#lx");
>> > +                  }
>> 
>> That prints [...] instead of just the number, though.
>
> Yes, of course it does.

This patch is needed on top.

diff --git a/tests/ipc_sem.c b/tests/ipc_sem.c
index d92ec60..345fc8a 100644
--- a/tests/ipc_sem.c
+++ b/tests/ipc_sem.c
@@ -26,13 +26,13 @@ main(void)
        un.buf = &ds;
        if (semctl(id, 0, IPC_STAT, un))
                goto fail;
-       printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_STAT, %p\\) += 0\n", id, &ds);
+       printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_STAT, \\[?%p\\]?\\) += 0\n", 
id, &ds);
 
        un.__buf = &info;
        int max = semctl(0, 0, SEM_INFO, un);
        if (max < 0)
                goto fail;
-       printf("semctl\\(0, 0, (IPC_64\\|)?SEM_INFO, %p\\) += %d\n", &info, 
max);
+       printf("semctl\\(0, 0, (IPC_64\\|)?SEM_INFO, \\[?%p\\]?\\) += %d\n", 
&info, max);
 
        un.buf = &ds;
        rc = semctl(id, 0, SEM_STAT, un);
@@ -43,16 +43,16 @@ main(void)
                 */
                if (-1 != rc || EINVAL != errno)
                        goto fail;
-               printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, %p\\) += -1 
EINVAL \\(Invalid argument\\)\n", id, &ds);
+               printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, \\[?%p\\]?\\) += 
-1 EINVAL \\(Invalid argument\\)\n", id, &ds);
        } else {
-               printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, %p\\) += %d\n", 
id, &ds, id);
+               printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, \\[?%p\\]?\\) += 
%d\n", id, &ds, id);
        }
 
        rc = 0;
 done:
        if (semctl(id, 0, IPC_RMID, 0) < 0)
                return 1;
-       printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_RMID, 0\\) += 0\n", id);
+       printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_RMID, \\[?0\\]?\\) += 0\n", id);
        return rc;
 
 fail:


Andreas.

-- 
Andreas Schwab, SUSE Labs, sch...@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to