使用 GstDiscoverer (GStreamer) 的分段错误
Posted
技术标签:
【中文标题】使用 GstDiscoverer (GStreamer) 的分段错误【英文标题】:Segmentation fault using GstDiscoverer (GStreamer) 【发布时间】:2015-12-27 09:42:31 【问题描述】:我正在为 C++ 上的 Windows 编写桌面应用程序,使用 Qt 进行 GUI 和 GStreamer 进行音频处理。
在我的应用程序中,如果它们在线,我需要监控多个互联网 aac 音频流,并收听具有最高优先级的可用流。对于这个任务,我使用来自 GStreamer 的 GstDiscoverer 对象,但我遇到了一些问题。
我每 1-2 秒检查一次音频流,因此经常调用 GstDiscoverer。 而且每次我的应用程序运行时,最终它都会在 GstDiscoverer 检查期间因分段错误错误而崩溃。
我尝试了调用 GstDiscoverer 的同步和异步方法( gst_discoverer_discover_uri()、gst_discoverer_discover_uri_async() ),两者的工作方式相同。
崩溃发生在 gsttypefindfunctions.c 第 1122 行(下面的第二行代码)的 aac_type_find() 函数中。
len = ((c.data[offset + 3] & 0x03) << 11) |
(c.data[offset + 4] << 3) | ((c.data[offset + 5] & 0xe0) >> 5);
在一次崩溃期间从调试器收到的局部变量:
正如我们所见,offset 变量大于 c.size,所以 c.data[offset] 超出范围,我认为这就是发生分段错误的原因。 这种情况不经常发生。该程序可以运行几个小时或十分钟。 但在我看来,如果 GstDiscoverer 调用之间的时间间隔很小,它会更频繁地发生。因此,调用 aac_type_find() 有一定的崩溃概率。
我尝试了 GStreamer 版本 1.6.1 和最新的 1.6.2,两者都存在错误。
有人可以帮我解决这个问题吗?这是 Gstreamer 错误还是我做错了什么?
【问题讨论】:
请将此情况报告给 GStreamer 开发人员,最好使用测试用例和示例文件。崩溃总是需要在您使用的软件中修复,并且您应该为此向开发人员报告。你可以在这里bugzilla.gnome.org/enter_bug.cgi?product=GStreamer @SebastianDröge:报告:bugzilla.gnome.org/show_bug.cgi?id=759910 【参考方案1】:此处已向 GStreamer 项目报告,并已合并崩溃补丁并将在下一个版本中:https://bugzilla.gnome.org/show_bug.cgi?id=759910
【讨论】:
以上是关于使用 GstDiscoverer (GStreamer) 的分段错误的主要内容,如果未能解决你的问题,请参考以下文章