• 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后反而看不到调用过程。
  • 相关阅读:
    [java tool]sonar与idea结合使用,度量代码质量
    【mockito】单元测试之mockito简单使用
    oracle ,mysql,postgres jdbc配置文件
    log4j配置文件及java调用 每个级别输出到不同的文件2
    log4j配置文件及java调用 每个级别输出到不同的文件
    tomcat编码问题
    pf4j实例 插件框架
    网络协议分为哪几层---物理层,连接层,网络层,传输层,应用层详解
    TF-IDF及其算法
    redhat7查看系统版本 修改主机名
  • 原文地址:https://www.cnblogs.com/shepherd2015/p/7968083.html
Copyright © 2020-2023  润新知