调试技巧之 gcc/g++ -instrument-functions 参数
来源:互联网 发布:淘宝天天特卖 编辑:程序博客网 时间:2024/05/21 11:09
调试技巧之 gcc/g++ -instrument-functions 参数
参考
GCC 函式追蹤功能 finstrument-functions __attribute__ +用 Graphviz 可视化函数调用
ibm 用 Graphviz 可视化函数调用
gcc/g++使用-finstrument-functions來觀察code每個function的呼叫
http://www.logix.cz/michal/devel/CygProfiler/cyg-profile.c.xp
http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Code-Gen-Options.html#Code-Gen-Options 官方参数说明
索引
- 简介
- c
- c++
- finstrument-functions-exclude-function-list=test 排除函数
因为项目太大,线程太多,gprof不可靠,于是找到了finstrument-functions
-finstrument-functions 會在每次進入與退出函式前呼叫 "__cyg_profile_func_enter" 與 "__cyg_profile_func_exit" 這兩個 hook function。等等,「進入」與「退出」是又何解?C Programming Language 最經典之處在於,雖然沒有定義語言實做的方式,但實際上 function call 皆以 stack frame 的形式存在,去年在「深入淺出 Hello World」Part II 有提過。所以上述那一大段英文就是說,如果我們不透過 GCC 內建函式 "__builtin_return_address" 取得 caller 與 callee 相關的動態位址,那麼仍可透過 -finstrument-functions,讓 GCC 合成相關的處理指令,讓我們得以追蹤。而看到 __cyg 開頭的函式,就知道是來自 Cygnus 的貢獻,在 gcc 2.x 內部設計可瞥見不少。
c
hello.c
#include <stdio.h>#define DUMP(func, call) printf("%s: func = %p, called by = %p/n", __FUNCTION__, func, call)void __attribute__((__no_instrument_function__))__cyg_profile_func_enter(void *this_func, void *call_site){ DUMP(this_func, call_site);}void __attribute__((__no_instrument_function__))__cyg_profile_func_exit(void *this_func, void *call_site){ DUMP(this_func, call_site);}main(){ puts("Hello World!"); return 0;}
makefile
all:hello.o gcc -finstrument-functions -finstrument-functions hello.o -o hellohello.o: gcc -finstrument-functions -c hello.cclean: rm *.o hello -rf
运行:
./hello__cyg_profile_func_enter: func = 0x8048438, called by = 0x658dec/nHello World!__cyg_profile_func_exit: func = 0x8048438, called by = 0x658dec/n
完
c++
hello.cc
#include <cstdlib>#include <cstdlib>#include <fstream>#include <iomanip>#include <iostream>using namespace std;#define DUMP(func, call) printf("%s: func = %p, called by = %p\n", __FUNCTION__, func, call)#ifdef __cplusplusextern "C" {#endif/* Static functions. */static FILE *openlogfile (const char *filename) __attribute__ ((no_instrument_function));static void closelogfile (void) __attribute__ ((no_instrument_function));/* Note that these are linked internally by the compiler. * Don't call them directly! */void __cyg_profile_func_enter (void *this_fn, void *call_site) __attribute__ ((no_instrument_function));void __cyg_profile_func_exit (void *this_fn, void *call_site) __attribute__ ((no_instrument_function));#ifdef __cplusplus};#endifvoid__cyg_profile_func_enter (void *this_fn, void *call_site){ DUMP(this_fn, call_site);}void__cyg_profile_func_exit (void *this_fn, void *call_site){ DUMP(this_fn, call_site);} intmain ( int argc, char *argv[] ){ cout << "\nProgram " << argv[0] << endl << endl; return EXIT_SUCCESS;} // ---------- end of function main ----------
makefile:
all: g++ -finstrument-functions hello.cc
运行:
./a.out__cyg_profile_func_enter: func = 0x80487ae, called by = 0x8048a3b__cyg_profile_func_enter: func = 0x8048714, called by = 0x80487d7__cyg_profile_func_exit: func = 0x8048714, called by = 0x80487d7__cyg_profile_func_exit: func = 0x80487ae, called by = 0x8048a3b__cyg_profile_func_enter: func = 0x8048882, called by = 0x658decProgram ./a.out__cyg_profile_func_exit: func = 0x8048882, called by = 0x658dec__cyg_profile_func_enter: func = 0x804881a, called by = 0x66e7f9__cyg_profile_func_exit: func = 0x804881a, called by = 0x66e7f9
hello.c
#include <stdio.h>#include "test.h"#define DUMP(func, call) printf("%s: func = %p, called by = %p\n", __FUNCTION__, func, call)void __attribute__((__no_instrument_function__))__cyg_profile_func_enter(void *this_func, void *call_site){ DUMP(this_func, call_site);}void __attribute__((__no_instrument_function__))__cyg_profile_func_exit(void *this_func, void *call_site){ DUMP(this_func, call_site);}void test(){ printf("nihao\n");}main(){ test(); puts("Hello World!"); return 0;}
makefile
CC=gcc44all:hello.o $(CC) -g -finstrument-functions hello.o -o hellohello.o: $(CC) -g -finstrument-functions -finstrument-functions-exclude-function-list=test -c hello.cclean: rm *.o hello -rf
运行:
./hello__cyg_profile_func_enter: func = 0x804847e, called by = 0xb7e6adecnihaoHello World!__cyg_profile_func_exit: func = 0x804847e, called by = 0xb7e6adec
完
- 调试技巧之 gcc/g++ -instrument-functions 参数
- 调试技巧之 gcc/g++ -instrument-functions 参数
- [GCC]_[初级]_[gcc(g++)相关使用参数技巧]
- gcc/g++编译器参数,gdb调试器参数,makefile文件
- g++/gcc编译参数 和 gdb常用调试命令
- GCC(G++) + GDB调试
- gcc g++ 参数
- gcc和g++参数
- gcc/g++参数详解
- gcc/g++参数详解
- gcc/g++参数详解
- gcc/g++参数详解
- gcc/g++ 参数
- gcc/g++参数详解
- gcc g++ 常用参数
- gcc g++ 参数
- gcc/g++参数详解
- gcc/g++参数详解
- 常用T-code
- lua, cocos2d工作使用笔记
- CentOS 学习记录
- 常用查看系统信息TCODE
- linux服务器上 oracle instantclient 客户端的安装和配置
- 调试技巧之 gcc/g++ -instrument-functions 参数
- Hadoop端口说明
- UIPageControl
- 模态窗体回传问题
- spring idref和ref的区别
- CSDN高校俱乐部巡讲执行手册
- 广泛使用的一个对特定在线用户发送系统消息的程序
- Hbase系统架构及数据结构
- 大规模服务设计部署经验谈