finstrument-functions

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 }
View Code
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}"
View Code

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 }
View Code

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
View Code

main.c

1 #include <stdio.h>
2 #include "./imple/bar.h"
3 
4 int main(int argc, char **argv) { 
5   bar(); 
6 }
View Code

然后按照如下顺序执行:

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后反而看不到调用过程。
原文地址:https://www.cnblogs.com/shepherd2015/p/7968083.html