表示がずれるので、空白2文字を全角空白にしていることに注意
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#ifndef __CYGWIN32__
#include <dlfcn.h>
#endif
/* BINARY HACKS P.300 */
/* 関数への enter/exit をフックする */
#ifndef __CYGWIN32__
__attribute__((no_instrument_function))
void addr2name(void *func_address, char *func_name)
{
Dl_info dli;
if (0 != dladdr(func_address, &dli)) {
strcpy(func_name, dli.dli_sname);
}
else {
strcpy(func_name, "");
}
}
#endif
__attribute__((no_instrument_function))
void __cyg_profile_func_enter(void *func_address, void *call_site)
{
extern void *__libc_stack_end;
char func_name[256];
int stack_size;
void *frame = __builtin_frame_address(1) + 8;
#ifndef __CYGWIN32__
addr2name(func_address, func_name);
stack_size = __libc_stack_end - __builtin_frame_address(0);
#else
strcpy(func_name, "");
stack_size = 0;
#endif
printf("enter %s:%p, from=%p stack size=%d\n",
func_name, func_address, call_site, stack_size);
}
__attribute__((no_instrument_function))
void __cyg_profile_func_exit(void *func_address, void *call_site)
{
char func_name[256];
#ifndef __CYGWIN32__
addr2name(func_address, func_name);
#else
strcpy(func_name, "");
#endif
printf("exit %s:%p, from=%p\n", func_name, func_address, call_site);
}
void sub_func(int arg1, char arg2, char *arg3)
{
}
void func(int arg1, char arg2, char *arg3)
{
sub_func(arg1, arg2, arg3);
}
__attribute__((no_instrument_function))
void func_no_instrument_function(int arg1, char arg2, char *arg3)
{
}
__attribute__((no_instrument_function))
int main(int argc, char *argv[])
{
int arg1 = 10;
char arg2 = 20;
char *arg3 = "abc";
printf("sub_func = %p\n", sub_func);
printf("func = %p\n", func);
func(arg1, arg2, arg3);
func_no_instrument_function(arg1, arg2, arg3);
return 0;
}
/* $ gcc -g -finstrument-functions -rdynamic foo.c -o a.out -ldl && ./a.out */
/* sub_func = 0x804891e */
/* func = 0x8048952 */
/* enter func:0x8048952, from=0x8048a13 stack size=264 */
/* enter sub_func:0x804891e, from=0x804898b stack size=312 */
/* exit sub_func:0x804891e, from=0x804898b */
/* exit func:0x8048952, from=0x8048a13 */
お礼
回答ありがとうございました。