2

我一定对堆栈或函数的调用方式有误解,我从 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

draw_glyphs忽略所有非 ascii 字符,这两个函数是如何draw_text被调用的?为什么堆栈上没有其他内容?当我选择 Frame #1 并尝试 goup时,它告诉我:

Initial frame selected; you cannot go up.

编辑:

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

这是否意味着它是一个动态创建的函数指针或什么?如果是这样,那会使堆栈像我的那样不可访问吗?

4

1 回答 1

3

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

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

最近基于帧的堆栈展开被展开表取代,但如果展开表不存在,gdb 仍然依赖于帧指针。

于 2012-06-20T09:20:10.497 回答