本文最后更新于: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
|