使用LD_PRELOAD挂载hook时能否调用backtrace获取栈回溯?
问题原因与修复方案
1. 编译参数缺失是最常见诱因
你编译hook动态库时没有添加栈展开所需的编译参数,导致glibc的backtrace无法正常遍历栈帧,直接返回0。
正确的编译命令如下:
gcc -fPIC -shared -o hook.so hook.c -rdynamic -ldl -fno-omit-frame-pointer
参数说明:
-rdynamic:导出所有符号,保证backtrace_symbols可以正确解析函数名-ldl:链接动态加载库,满足dlsym的依赖-fno-omit-frame-pointer:保留栈帧指针,保证栈展开逻辑可以正常遍历调用栈
2. 代码存在头文件缺失问题
你的hook代码中使用了dlsym和RTLD_NEXT,但没有引入<dlfcn.h>头文件,会触发函数隐式声明的未定义行为,64位环境下极易出现指针截断,也可能导致backtrace执行异常。需要在代码头部补充:
#include <dlfcn.h>
3. 目标二进制程序的限制
如果完成上述修改后仍然返回0栈帧,说明你要hook的目标二进制程序本身做了编译优化限制:
- 目标程序编译时开启了
-fomit-frame-pointer优化,没有保留栈帧指针 - 目标程序被strip掉了所有符号信息
- 目标程序是静态编译的
这种场景下你可以替换glibc自带的backtrace为libunwind库,后者的栈展开兼容性更强,支持无栈帧指针场景下的栈回溯。
内容的提问来源于stack exchange,提问作者desionxxx
相关产品推荐
相关产品推荐

