[英]Stepping Over in Emacs GDB
我在GDB中遇到了一些麻烦。 我已经在ffmpeg库中构建了一个示例程序,其中包含调试符号并将其剥离。 虽然我将ffmpeg库配置为静态并显式禁用了共享,但看起来我正在调试的程序是动态链接的,因为它的文件大小只有99kB。 我不知道这是问题,但想提一下。
在av_seek_frame中设置并命中断点后,我使用'next'命令跳过。 但是,这将进入av_seek_frame()中的第一个函数,如下所示。 此外,如果做第二个“下一个”,则回溯将无法跟踪它的位置。 我设置错了吗? 我怎么能跨过去? 我应该注意,我仔细检查了'set step-mode off'是默认关闭的(因为我相信这会在没有调试信息的第一段代码中断开。)
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 ?? ()
如果您不确定您的二进制文件是否是静态链接的,可以使用ldd进行检查并查看如下消息:
% ldd ffmpeg
not a dynamic executable
接下来,请确保为gdb提供可执行文件的完整路径,这样您就不会意外地在系统中的其他位置安装二进制文件。
很可能你加载了错误的二进制文件。 即使不使用--disable-stripping和--disable-optimizations,我也可以使用step
和next
命令来使用gdb。 您不需要使用--disable-stripping,因为在gdb中您可以使用ffmpeg_g二进制文件(或者如果您碰巧运行ffmpeg二进制file ffmpeg_g
,则可以使用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的这个问题应该被视为一个bug。 当我得到片刻时,我将提交gud-break / gud-format-command的补丁来解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.