gcc选项跟踪函数调用

本文最后更新于:2025年11月19日 下午

关键字:trace

有时需要追踪函数究竟挂在了哪儿,gdb是一个不错的调试工具,但遇到栈被破坏的情况,并不能打印出调用栈,这时下面的方法就排上用处了。

增加gcc编译选项 -finstrument-functions
gcc会自动在函数的入口和出口增加一个函数调用,函数原型为:

1
2
void __cyg_profile_func_exit(void* callee, void* callsite) __attribute__((no_instrument_function));
void __cyg_profile_func_enter(void* callee, void* callsite) __attribute__((no_instrument_function));

以下为自定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <execinfo.h>

void __cyg_profile_func_exit(void* callee, void* callsite) __attribute__((no_instrument_function));
void __cyg_profile_func_enter(void* callee, void* callsite) __attribute__((no_instrument_function));

void __cyg_profile_func_enter(void* callee, void* callsite) {
void *funptr = callee;
char **p = backtrace_symbols(&funptr, 1);
printf("\033[;31m Entering: %s \033[0m\n", *p);
free(p);
}

void __cyg_profile_func_exit(void* callee, void* callsite) {
void *funptr = callee;
char **p = backtrace_symbols(&funptr, 1);
printf("\033[;31m Exiting: %s \033[0m\n", *p);
free(p);
}

运行时就会打印出来函数调用来了,如:

1
2
3
4
5
Entering: ./blink() [0x1bb2c] 
Entering: ./blink() [0x2028c]
Entering: ./blink() [0x1ffe4]
Entering: ./blink() [0x1f400]
Exiting: ./blink() [0x1f400]

再用addr2line(进程加了-g编译)来解析地址:

1
/opt/toolchains/crosstools-arm-gcc-9.2-linux-4.19-glibc-2.30-binutils-2.32/usr/bin/arm-buildroot-linux-gnueabi-addr2line -e tmp/blink -f 0x1f400

输出如下:

1
2
hgdpi_is_debug
/home/leon/code/bcm-ax3000-cmcc/userspace/private/apps/blink-sdk-publish/adapt/public_adapt/blink_msg.cpp:57

gcc选项跟踪函数调用
https://leon0625.github.io/2023/08/28/b38c13ae5dd0/
作者
leon.liu
发布于
2023年8月28日
许可协议