追踪C函数执行路径

2 篇文章 0 订阅

利用gcc特性,追踪函数执行路径

#include <stdio.h>
#include <time.h>
 
static FILE *fp_trace;
 
void
__attribute__((__no_instrument_function__))
__attribute__ ((constructor))
trace_begin (void)
{
 fp_trace = fopen("tracefunc.out", "w");
}
 
void
__attribute__((__no_instrument_function__))
__attribute__ ((destructor))
trace_end (void)
{
 if(fp_trace != NULL) {
 fclose(fp_trace);
 }
}
 
void __attribute__((__no_instrument_function__))
__cyg_profile_func_enter (void *func,  void *caller)
{
 if(fp_trace != NULL) {
 fprintf(fp_trace, "e %p %p %lu\n", func, caller, time(NULL) );
 }
}
 
void __attribute__((__no_instrument_function__))
__cyg_profile_func_exit (void *func, void *caller)
{
 if(fp_trace != NULL) {
 fprintf(fp_trace, "x %p %p %lu\n", func, caller, time(NULL));
 }
}

输出的文件解析成行数执行路径:

#!/bin/bash
if test ! -f "$1"
then
 echo "Error: executable $1 does not exist."
 exit 1
fi
if test ! -f "$2"
then
 echo "Error: trace log $2 does not exist."
 exit 1
fi
EXECUTABLE="$1"
TRACELOG="$2"
ident=0
while read LINETYPE FADDR CADDR CTIME; do
# CDATE="$(date -Iseconds -d @${CTIME})"
 if test "${LINETYPE}" = "e"
 then
     FNAME="$(addr2line -f -e ${EXECUTABLE} ${FADDR}|head -1)"
     CLINE="$(addr2line -s -e ${EXECUTABLE} ${CADDR})"
     for (( c=1; c<=ident; c++)) ; do echo -n "+" ; done 
     printf "${FNAME}"
     echo
     ident=$((ident+2))
 fi
 if test "${LINETYPE}" = "x"
 then
     ident=$((ident-2))
 fi
done < "${TRACELOG}"

GCC的编译参数需要设置如下:

-g -O0 -finstrument-functions

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值