从GDB获取堆栈跟踪

时间:2012-06-19 14:50:00

标签: c gdb stack backtrace

我必须对堆栈有误解,或者如何调用函数,我从GDB得到的回溯结果对我没有意义。我试图找出在程序中调用的地方,以便我可以添加我的组件。

该工具在视频上绘制边界框,我所做的是插补器。我认为打开GDB并在绘制框时设置断点并运行回溯是有意义的。这是mu输出(从ffmpeg.c main()运行程序后)

#0  draw_glyphs (vidatbox=0x10183d200, picref=0x10141e340, width=720, height=480,
rgbcolor=0x10183d284 "????", yuvcolor=0x10183d278 "뀀?\020???\020???????", x=0, y=0) at 
libavfilter/vf_VidAT.c:627
#1  0x000000010001ce4c in draw_text (ctx=0x10120df20, picref=0x10141e340, width=720, 
height=480) at libavfilter/vf_VidAT.c:787

忽略所有非ascii字符,如何调用两个函数draw_glyphsdraw_text?为什么堆栈上没有其他东西?当我选择第1帧并试着去up时,它会告诉我:

Initial frame selected; you cannot go up.

编辑:

我看起来更多了,当我问起时,我更加困惑。函数draw_glyphs甚至没有在我正在运行的main中调用。我已经浏览了所有用于编译的文件,而且......在任何地方都没有调用它!

这是否意味着它是一个动态创建的函数指针或什么?如果是这样,那会不会像我一样无法接近堆栈?

1 个答案:

答案 0 :(得分:3)

如果堆栈跟踪信息丰富但是意外终止(特别是在一两个条目之后),则表明gdb无法在该点之后跟随调用堆栈。

干扰堆栈展开的编译器选项包括更高的优化级别(尤其是-O3)和-fomit-frame-pointer,因此请搜索Makefile并删除这些选项。 frame pointer通常不需要执行代码,因此将其用作通用寄存器可以提高缺少寄存器的架构(如x86)的性能,但会干扰调试。

最近基于帧的堆栈展开正在被unwind tables替换,但是如果不存在展开表,gdb仍然依赖于帧指针。