zoukankan      html  css  js  c++  java
  • 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后反而看不到调用过程。
  • 相关阅读:
    关于使用JavaMail注册激活邮箱的注意点
    Maven Web报错:org.apache.jasper.JasperException: Unable to compile class for JSP
    IDEA的中文乱码问题
    深入了解Java动态代理与反射机制
    String、StringBuffer和StringBuilder的区别
    Java中HashCode()和equals()的关系
    Java中向下转型的意义
    局部内部类访问局部变量的问题
    Java内部类的应用场景
    Python os.rmdir() 方法
  • 原文地址:https://www.cnblogs.com/shepherd2015/p/7968083.html
Copyright © 2011-2022 走看看