【发布时间】:2015-12-15 20:33:37
【问题描述】:
我正在我的代码中导入一个堆栈跟踪 C 代码(在 Stack Overflow 上的某处)来跟踪内存块的分配位置:
struct layout
{
struct layout *ebp;
void *ret;
};
struct layout *fr;
__asm__("movl %%ebp, %[fp]" : /* output */ [fp] "=r" (fr));
for (int i=1 ; i<8 && (unsigned char*) fr > dsRAM; i++) {
x[i] = (size_t) fr->ret;
fr = fr->ebp;
}
一切运行良好,除了在某些调用中,代码在堆栈顶部附近缺少一些函数,例如GDB 将报告:
- main.cpp 中的 malloc()
- 来自 libstdc++.so.6 的运算符 new()
- BasicScript.cpp 中的 TestBasicScript()
- main.cpp 中的 main()
虽然代码用 malloc、new 运算符和 main() 的地址填充 x[],但缺少 TestBasicScript。
代码由 g++ 4.5.1(用于自制控制台编程的旧 devkit)编译,带有以下标志:
CFLAGS += -I libgeds/source/ -I wrappers -I $(DEVKITPRO)/include -DARM9 \
-include wrappers/nds/system.h -include wrappers/fake.h
CFLAGS += -m32 -Duint=uint32_t -g -Wall -Weffc++ -fno-omit-frame-pointer
我尝试改用__builtin_return_address(),但我得到了几乎相同的结果,但代码更长。
编辑:我注意到我系统地缺少operator new 的调用者,如果_Znwj 的代码没有设置堆栈帧,这可以解释。所以问题列表变成了:
如果 TestBasicScript() 函数调用不在堆栈帧列表中,GDB 如何设法找到它?
如何配置链接步骤以便使用 libstdc++ 的调试友好变体(如果有)?
原始子问题“是否有编译时选项可以保证我可以跟踪 100% 对我的 malloc 克隆的调用?”因此由@chqrlie 回答:-O0 是我所需要的。但它只有在应用于所有我的二进制文件(包括共享库)时才会有效。
【问题讨论】:
标签: c++ c debugging gcc stack-trace