2017-12-03 23:59:16
参考 如何快速地在每个函数入口处加入相同的语句?
https://www.zhihu.com/question/56132218
做个存档
1 scj@scjComputer:~/THpro/func_trace$ tree . 2 . 3 ├── func_trace.c 4 ├── func_trace.sh 5 ├── imple 6 │ ├── bar.c 7 │ └── bar.h 8 ├── main.c 9 └── 步骤
func_trace.c

1 #include <stdio.h> 2 3 static FILE *fp_trace; 4 5 void __attribute__((constructor)) traceBegin(void) { 6 fp_trace = fopen("func_trace.out", "w"); 7 } 8 9 void __attribute__((destructor)) traceEnd(void) { 10 if (fp_trace != NULL) { 11 fclose(fp_trace); 12 } 13 } 14 15 void __cyg_profile_func_enter(void *func, void *caller) { 16 if (fp_trace != NULL) { 17 fprintf(fp_trace, "entry %p %p ", func, caller); 18 } 19 } 20 21 void __cyg_profile_func_exit(void *func, void *caller) { 22 if (fp_trace != NULL) { 23 fprintf(fp_trace, "exit %p %p ", func, caller); 24 } 25 }
func_trace.sh

1 #!/bin/bash 2 EXECUTABLE="$1" 3 TRACELOG="$2" 4 5 while read TRACEFLAG FADDR CADDR; do 6 FNAME="$(addr2line -f -e ${EXECUTABLE} ${FADDR}|head -1)" 7 8 if test "${TRACEFLAG}" = "entry" 9 then 10 CNAME="$(addr2line -f -e ${EXECUTABLE} ${CADDR}|head -1)" 11 CLINE="$(addr2line -s -e ${EXECUTABLE} ${CADDR})" 12 echo "Enter ${FNAME} called from ${CNAME} (${CLINE})" 13 fi 14 15 if test "${TRACEFLAG}" = "exit" 16 then 17 echo "Exit ${FNAME}" 18 fi 19 20 done < "${TRACELOG}"
bar.c

1 #include "bar.h" 2 3 int bar(void) { 4 zoo(); 5 return 1; 6 } 7 8 int foo(void) { 9 return 2; 10 } 11 12 void zoo(void) { 13 foo(); 14 }
bar.h

1 #ifndef bar_h 2 #define bar_h 3 4 int bar(void); 5 int foo(void); 6 void zoo(void); 7 8 #endif
main.c

1 #include <stdio.h> 2 #include "./imple/bar.h" 3 4 int main(int argc, char **argv) { 5 bar(); 6 }
然后按照如下顺序执行:
1 gcc func_trace.c -c 2 gcc main.c ./imple/*.c func_trace.o -finstrument-functions 3 ./a.out 4 ./func_trace.sh a.out func_trace.out
可以直接编译好多源文件的程序了。
直接把main.c以外的文件放进imple文件夹里头就可以
如果第二步有问题,用
gcc main.c ./source/*.c func_trace.o -finstrument-functions 2>trace_log.txt
导出编译信息
imple文件夹里头的东西封装成so后反而看不到调用过程。