2010-05-18 49 views
3

我在GDB中遇到了一些麻烦。我已经在ffmpeg库中构建了一个示例程序,其中带有调试符号并剥离。尽管我将ffmpeg库配置为static并显式禁用共享,但它看起来像我正在调试的程序是动态链接的,因为它的文件大小仅为99kB。我不知道这是问题,但想到提及它。在Emacs GDB中逐步完成

在我设置并在av_seek_frame中创建断点后,我使用'next'命令来逐步完成。但是,这将进入av_seek_frame()中的第一个函数,如下所示。此外,如果第二个“下一个”做了,那么回溯失去了跟踪它的位置。我错了吗?我怎样才能跨过?我应该注意到我仔细检查了那一步设置模式关'关闭作为默认的(因为我相信这将在第一段代码没有调试信息打破。)

Breakpoint 1, av_seek_frame (s=0x16429000, stream_index=0, timestamp=29727438, flags=0) at l 
(gdb) list 
1648 
1649  return 0; 
1650 } 
1651 
1652 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags 
1653 { 
1654  int ret; 
1655  AVStream *st; 
1656 
1657  ff_read_frame_flush(s); 
(gdb) next 
ff_read_frame_flush (s=0x16429000) at libavformat/utils.c:1248 
(gdb) list 
1243 
1244 /** 
1245  * Flush the frame reader. 
1246  **/ 
1247 void ff_read_frame_flush(AVFormatContext *s) 
1248 { 
1249  AVStream *st; 
1250  int i, j; 
1251 
1252  flush_packet_queue(s); 
(gdb) next 
ff_read_frame_flush (s=0x16429000) at libavformat/utils.c:1252 
(gdb) where 
#0 ff_read_frame_flush (s=0x16429000) at libavformat/utils.c:1252 
#1 0x00000000 in ??() 
+0

你是用'-fomit-frame-pointer'构建的吗? – 2010-05-18 19:06:57

+0

我不这么认为,但它可能是因为我在基于unix风格配置的构建中不太舒服。我的配置选项(构建ffmpeg库和我正在调试的ffplay示例是:) ./configure --enable-libmp3lame --enable-static --enable-pthreads --enable -ffplay --disable-shared - - 禁用 - 优化 - 禁用 - mmx - 禁用 - 剥离 - 启用 - 调试 – 2010-05-18 19:08:37

+0

尝试检查'show step-mode' - 我不使用emacs,所以不确定它的默认值是什么。 – 2010-05-18 19:19:47

回答

1

如果你不知道您的二进制文件是否被静态链接,你可以用LDD检查,并看到这样的消息:

% ldd ffmpeg 
     not a dynamic executable 

接下来,确保你给让你不小心用gdb可执行的完整路径选择安装在你的PATH系统中其他地方的二进制文件。

很可能你正在加载错误的二进制文件。即使没有使用--disable-stripping和--disable-优化我可以使用gdb罚款使用stepnext命令。你不需要使用--disable-stripping,因为在gdb里你可以使用ffmpeg_g二进制文件(或者如果你碰巧运行ffmpeg二进制文件,你可以使用file ffmpeg_g从它加载符号)。

出于调试的目的,使用--disable-optimizations是很好的,因此在检查变量时不会得到value optimized out,但严格来说,您不需要使用该选项来获取emacs/gdb的行为。 ..使用优化时,我没有遇到任何问题。

有一点需要记住,但是,在Emacs中设置gud/gdb时可能会导致混淆的断点:gud-break命令仅使用文件名的基本部分来设置断点,而不是绝对路径对于ffmpeg来说,这意味着如果你在utils.c中设置了一个断点,它可能无法正常工作,具体取决于你在gdb中设置的源代码搜索路径的值,因为ffmpeg有多个文件在不同的路径中命名为utils.c(实际上,总共有5个utils.c文件,每个lib *子目录中有一个)。默认情况下,搜索路径设置为$ cdir:$ cwd,但是如果将其设置为/ path/to/ffmpeg:$ cdir:$ cwd,并且您尝试在libavformat的utils.c中设置断点,它可能在libavutil中找到一个 - 在这种情况下,如果你幸运的话,它会抱怨你想要设置断点的行不存在(因为libavutil中的那个行较短),或者它可能会设置一个断点你想要的行,但在错误的utils.c。

gud/gdb的这个问题应该被认为是一个错误。当我得到片刻时,我会提交gud-break/gud-format-command的补丁来解决这个问题。