在不修改源代码的情况下,如何调用某些函数(在下面的示例中称为func100)时,如何跟踪调用哪些函数以及什么参数.我想输出如下:
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,p1203=xxx) exit func100(p1001=xxx,p1002=xxx)@H_404_4@这是可行吗或者最少修改源代码的解决方案是什么?
解决方法
如果使用gcc,可以使用-finstrument-functions编译标志.
每当函数进入/退出时,它会添加调用两个函数__cyg_profile_func_enter和__cyg_profile_func_exit的代码. @H_404_4@你需要实现这些功能,做你想要的.确保编译它们没有标志,或使用属性((no_instrument_function)),所以他们不会尝试调用自己. @H_404_4@函数的第二个参数是指向调用站点的指针(即调用函数内的返回地址).你可以打印它与%p,但它将有点难以使用.您可以使用nm来计算包含该地址的真实函数. @H_404_4@您无法通过这种方式获取函数参数.
每当函数进入/退出时,它会添加调用两个函数__cyg_profile_func_enter和__cyg_profile_func_exit的代码. @H_404_4@你需要实现这些功能,做你想要的.确保编译它们没有标志,或使用属性((no_instrument_function)),所以他们不会尝试调用自己. @H_404_4@函数的第二个参数是指向调用站点的指针(即调用函数内的返回地址).你可以打印它与%p,但它将有点难以使用.您可以使用nm来计算包含该地址的真实函数. @H_404_4@您无法通过这种方式获取函数参数.