Without modifying the source code, how can i trace which functions are called and with what parameters, when some function(say func100 in the following example) is invoked. I would like the output to be as follows:
enter func100(p1001=xxx,p1002=xxx)
enter func110(p1101=xxx,p1102=xxx)
exit func110(p1101=xxx,p1102=xxx)
enter func120(p1201=xxx,p1202=xxx,p1203=xxx)
enter func121(p1211=xxx)
exit func121(p1211=xxx)
exit func120(p1201=xxx,p1202=xxx,p1203=xxx)
exit func100(p1001=xxx,p1002=xxx)
is this doable? or what's the solution with minimum modification of source code?
If you use gcc
, you can use the -finstrument-functions
compilation flag.
It adds code that calls two functions, __cyg_profile_func_enter
and __cyg_profile_func_exit
, whenever a function enters/exits.
You'll need to implement these functions, to do what you want. Make sure to compile them either without the flag, or with __attribute__((no_instrument_function))
, so they won't try to call themselves.
The functions' second parameter would be a pointer to the call site (i.e. the return address within the calling function). You can just print it with %p
, but it will be somewhat hard to use. You can use nm
to figure out the real function which contains this address.
You can't get the function parameters this way.