How to build additional function wrappers

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

How to build additional function wrappers

Serhei Makarov
Hello all,

I'm writing a Valgrind tool that makes use of function wrapping. From
what I understand, wrappers need to run on the simulated CPU. I wrote
a simple example which imitates the way Memcheck uses
mc_replace_strmem.c to generate a preloaded .so that contains my own
wrappers. A simplified version of my code is attached; I've been
having some problems with it.

After compiling and running the tool (using the 3.12.0 codebase on
Linux), the instrumented programs crash in odd ways:

$ inst/bin/valgrind --tool=simplewrap ls
==1201== SimpleWrap, do only basic function wrapping
==1201== basic example for mailing list
==1201== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==1201== Command: ls
==1201==
--1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
--1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
--1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
--1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
--1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
--1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
--1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
ls: memory exhausted
==1201==

$ ./vg-in-place --tool=wrapsimple gcc --help

==1215== SimpleWrap, do only basic function wrapping
==1215== basic example for mailing list
==1215== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==1215== Command: gcc --help
==1215==
--1215-- VG_USERREQ__CLIENT_CALL1: func=0x0
--1215-- VG_USERREQ__CLIENT_CALL1: func=0x0
terminate called without an active exception
==1215==
==1215== Process terminating with default action of signal 6 (SIGABRT)
==1215==    at 0x516F91F: raise (raise.c:58)
==1215==    by 0x5171519: abort (abort.c:89)
==1215==    by 0x47347C: ??? (in /usr/bin/gcc)
==1215==    by 0x472F05: ??? (in /usr/bin/gcc)
==1215==    by 0x472F50: ??? (in /usr/bin/gcc)
==1215==    by 0x471C51: ??? (in /usr/bin/gcc)
==1215==    by 0x4717A7: ??? (in /usr/bin/gcc)
==1215==    by 0x4657B6: ??? (in /usr/bin/gcc)
==1215==    by 0x441FED: ??? (in /usr/bin/gcc)
==1215==    by 0x481AAC: ??? (in /usr/bin/gcc)
==1215==    by 0x515A38F: (below main) (libc-start.c:245)
==1215==
Aborted (core dumped)

These crashes also happen if I comment out the wrapper function and
compile the tool with an 'empty' sw_wrap.c, so the cause appears to
relate to something I'm (not) doing with the build system to set up
the preloaded .so, rather than the way the wrapper itself is written.
Does anyone have a suggestion for how to properly add function
wrappers to a Valgrind tool?

All the best,
   Serguei Makarov

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Valgrind-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Makefile.am (5K) Download Attachment
sw_main.c (1K) Download Attachment
sw_wrap.c (644 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: How to build additional function wrappers

Serhei Makarov
The errors occurred because I included libreplacemalloc in my tool,
which calls VG_USERREQ__GET_MALLOCFUNCS (getting a table full of NULL
function values), and then tries to call those functions instead of
malloc(). In hindsight, the "memory exhausted" error was a clue
pointing to this.

Removing the dependencies on LIBREPLACEMALLOC in Makefile.am solved the problem.

All the best,
      Serguei Makarov

On Mon, Jun 26, 2017 at 5:41 PM, Serhei Makarov <[hidden email]> wrote:

> Hello all,
>
> I'm writing a Valgrind tool that makes use of function wrapping. From
> what I understand, wrappers need to run on the simulated CPU. I wrote
> a simple example which imitates the way Memcheck uses
> mc_replace_strmem.c to generate a preloaded .so that contains my own
> wrappers. A simplified version of my code is attached; I've been
> having some problems with it.
>
> After compiling and running the tool (using the 3.12.0 codebase on
> Linux), the instrumented programs crash in odd ways:
>
> $ inst/bin/valgrind --tool=simplewrap ls
> ==1201== SimpleWrap, do only basic function wrapping
> ==1201== basic example for mailing list
> ==1201== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
> ==1201== Command: ls
> ==1201==
> --1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
> --1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
> --1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
> --1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
> --1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
> --1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
> --1201-- VG_USERREQ__CLIENT_CALL1: func=0x0
> ls: memory exhausted
> ==1201==
>
> $ ./vg-in-place --tool=wrapsimple gcc --help
>
> ==1215== SimpleWrap, do only basic function wrapping
> ==1215== basic example for mailing list
> ==1215== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
> ==1215== Command: gcc --help
> ==1215==
> --1215-- VG_USERREQ__CLIENT_CALL1: func=0x0
> --1215-- VG_USERREQ__CLIENT_CALL1: func=0x0
> terminate called without an active exception
> ==1215==
> ==1215== Process terminating with default action of signal 6 (SIGABRT)
> ==1215==    at 0x516F91F: raise (raise.c:58)
> ==1215==    by 0x5171519: abort (abort.c:89)
> ==1215==    by 0x47347C: ??? (in /usr/bin/gcc)
> ==1215==    by 0x472F05: ??? (in /usr/bin/gcc)
> ==1215==    by 0x472F50: ??? (in /usr/bin/gcc)
> ==1215==    by 0x471C51: ??? (in /usr/bin/gcc)
> ==1215==    by 0x4717A7: ??? (in /usr/bin/gcc)
> ==1215==    by 0x4657B6: ??? (in /usr/bin/gcc)
> ==1215==    by 0x441FED: ??? (in /usr/bin/gcc)
> ==1215==    by 0x481AAC: ??? (in /usr/bin/gcc)
> ==1215==    by 0x515A38F: (below main) (libc-start.c:245)
> ==1215==
> Aborted (core dumped)
>
> These crashes also happen if I comment out the wrapper function and
> compile the tool with an 'empty' sw_wrap.c, so the cause appears to
> relate to something I'm (not) doing with the build system to set up
> the preloaded .so, rather than the way the wrapper itself is written.
> Does anyone have a suggestion for how to properly add function
> wrappers to a Valgrind tool?
>
> All the best,
>    Serguei Makarov

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Valgrind-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/valgrind-users
Loading...