2017-12-03 23:59:16
参考 如何快速地在每个函数入口处加入相同的语句?
做个存档
1 scj@scjComputer:~/THpro/func_trace$ tree .2 .3 ├── func_trace.c4 ├── func_trace.sh5 ├── imple6 │ ├── bar.c7 │ └── bar.h8 ├── main.c9 └── 步骤
func_trace.c
1 #include2 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\n", 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\n", 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 then10 CNAME="$(addr2line -f -e ${EXECUTABLE} ${CADDR}|head -1)"11 CLINE="$(addr2line -s -e ${EXECUTABLE} ${CADDR})"12 echo "Enter ${FNAME} called from ${CNAME} (${CLINE})"13 fi14 15 if test "${TRACEFLAG}" = "exit"16 then17 echo "Exit ${FNAME}"18 fi19 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_h2 #define bar_h3 4 int bar(void);5 int foo(void);6 void zoo(void);7 8 #endif
main.c
1 #include2 #include "./imple/bar.h"3 4 int main(int argc, char **argv) { 5 bar(); 6 }
然后按照如下顺序执行:
1 gcc func_trace.c -c2 gcc main.c ./imple/*.c func_trace.o -finstrument-functions3 ./a.out4 ./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后反而看不到调用过程。