0

情况:

我正在工作场所升级一些代码。该代码适用于基于 GMime 的进程。我们目前使用 GMime 2.2,我最近升级了我们的代码以使用 GMime 2.4。过程运行得很好,没有崩溃,但我得到了

GLib-GObject-CRITICAL **: g_object_unref: assertion G_IS_OBJECT (object)' failed

程序运行时时不时地。

有时调用 g_object_unref 会失败并使我的程序崩溃。我正在尝试对此进行调试,但不幸的是,制作此程序的人没有添加任何测试或调试功能。

当您必须返回旧代码时,我知道并理解嵌入调试信息或设置测试框架的重要性。我知道如何在纯 C 或纯 C++ 中设置它,但是一旦其他库被扔进去,它就变得非常困难。

我的问题是:

如何使用依赖 GLib 或 GObject 的程序有效地设置调试代码和/或测试系统?

我的问题是:

  1. 我怎样才能知道代码中发生了什么?我应该听“信号”吗?如何设置这些信号?
  2. g_object_unrefreturn之类的函数void。既然如此,我该如何输出与这些功能相关的调试信息呢?
  3. GObject 是否有“属性/类成员”,我不知道与 GLib 相关的正确术语,其中嵌入了错误信息?
  4. (相关,但稍微偏离主题)像 GLib 和 node.js 等库有“广泛”的文档,相当于:

    function doSomethingThatShouldBeUsefulAndUnderstoodByAnyoneWhoReadsThis(WYSIWYG, FIY, BYOF, X, Y, Z) // this function does something that should be usefull and understood by anyone who reads the function this does something and can be called

    当大多数教程将您引回文档或者文档本身时,一个人如何拥有大量编程经验(使用纯语言形式),如何在库中做出正面或反面?

  5. 有推荐的教程吗?

我看过的网站:

非常感谢任何和所有的意见、问题和建议!

谢谢你。

4

1 回答 1

1

我知道调试此类问题的最简单方法是在调试器下运行程序并在 g_logv 上中断(该错误消息是用 g_logv 打印的),当调试器捕获对 g_logv 的调用时,您可以获得回溯以查看在哪里在你的程序中,你是。

通常这些类型的错误发生在程序员试图在 NULL 指针上调用 g_object_unref() 时。

也就是说,您是否有理由只升级到 GMime 2.4 而不是 GMime 2.6?2.6 已经发布好几年了,是维护得最好的系列。

于 2013-08-08T17:13:39.300 回答