Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 如何打开自动释放工具_Debugging_Macos - Fatal编程技术网

Debugging 如何打开自动释放工具

Debugging 如何打开自动释放工具,debugging,macos,Debugging,Macos,我被激怒了 ***\uuu NSAutoreleaseNoPool():NSEvent类的对象0x1961180在没有池的情况下自动释放-只是泄漏 运行时出现警告,但不知道原因是什么。粗略的谷歌指出,这是一个我可以用Xcode中断的符号,但是通过运行>管理断点>添加符号断点,或者简单地通过断点管理窗口,将其添加为符号断点,结果是断点旁边有一个-而不是一个检查,我认为这是一个找不到的符号 我试着用两个下划线,一个下划线添加符号“\uu NSAutoreleaseNoPool”,现在我觉得自己很愚蠢

我被激怒了

***\uuu NSAutoreleaseNoPool():NSEvent类的对象0x1961180在没有池的情况下自动释放-只是泄漏

运行时出现警告,但不知道原因是什么。粗略的谷歌指出,这是一个我可以用Xcode中断的符号,但是通过运行>管理断点>添加符号断点,或者简单地通过断点管理窗口,将其添加为符号断点,结果是断点旁边有一个-而不是一个检查,我认为这是一个找不到的符号

我试着用两个下划线,一个下划线添加符号“\uu NSAutoreleaseNoPool”,现在我觉得自己很愚蠢。错误会继续被记录,并且不会命中任何断点。任何用于中断Obj-C符号或调试Obj-C符号的指针都将不胜感激


[编辑:大概10次(10次以上,总共几十次,包括至少两次Xcode重启)运行后,我的控制台上打印了“挂起的断点9-”\uu nsautoreleasenool“已解决”,断点开始工作。有没有办法强制挂起的断点实际解决?]

这里的问题很简单:你是在没有池的情况下释放的。这通常发生在命令行工具的基础上。只需将以下代码添加到
main()
:(不相关的部分省略)


编辑:如果你不是在创建命令行工具,那么你很可能是在做一些淘气的事情;但是,尽管如此:如果您有在
NSApplicationMain()
之前调用的代码,那么您需要将其封装在相同的基本代码中,在调用
NSApplicationMain

之前排空并释放池。听起来您好像在某个线程中使用了Cocoa,而没有使用自动释放池封装线程体。您可能不需要使用断点来查找它。您正在执行任何detachNewThreadSelector吗?

我对在自动释放工具()上设置断点有相同的问题。 我最终使用gdb命令成功地设置了断点。 调试器启动后,在调试器控制台中按ctrl+C。
使用“br\u nsautoreleasenool”设置断点并重新启动调试器。

要真正回答您的问题,请查看
NSDebug.h
。您将在此处找到一条评论,这是其中的一部分:

NAME OF ENV. VARIABLE                  DEFAULT  SET TO...
NSDebugEnabled                            NO    "YES"
NSZombieEnabled                           NO    "YES"
NSDeallocateZombies                       NO    "YES"
NSHangOnUncaughtException                 NO    "YES"
下面是这些评论:

// Functions used as interesting breakpoints in a debugger
// void __NSAutoreleaseNoPool(void *object);
        // Called to log the "Object X of class Y autoreleased with no
        // pool in place - just leaking" message.  If an environment
        // variable named "NSAutoreleaseHaltOnNoPool" is set with string
        // value "YES", the function will automatically break in the
        // debugger (or terminate the process).

// void __NSAutoreleaseFreedObject(void *freedObject);
        // Called when a previously freed object would be released
        // by an autorelease pool.  If an environment variable named
        // "NSAutoreleaseHaltOnFreedObject" is set with string value
        // "YES", the function will automatically break in the debugger
        // (or terminate the process).

因此,您实际上不需要设置这些断点;只需设置适当的环境变量。您可以从例如
.bashrc
或在Xcode 4中编辑“scheme”的“Run”部分并将它们设置在那里——这就是我所做的,它工作得很好。

我知道这是一个旧线程。只是想和大家分享一下正确的解决方案。 在_autoreleasenool上设置断点的正确方法是在xcode中使用断点导航器(使用key命令+6)。
在断点导航器的左下部分,单击“+”符号并添加符号断点。以objc_autoreleasenool的形式输入符号。

虽然我最初的问题更多地涉及断点,但我仍然纠结于此。现在我真的要崩溃了,我看到了下面的堆栈,正如您所看到的,我的NSApplicationMain周围有一个自动发布池,在运行时仍然会出现NSNoAutoreleasePool错误,没有执行任何代码(main之外):关于自动发布池的旁白:为什么有必要这样做?主运行循环的自动释放池不应该处理这个问题吗?另一个面包屑,它也会在每次“无池到位”错误后打印。恢复了最近的任何更改,但仍会显示;我想我之前没有注意到:>***尝试弹出未知的自动释放池(0x89ac00)啊。自动释放池不应该出现在
NSApplicationMain()
附近。特定的函数处理自己的池。@Williham Totland:它也不会造成任何伤害。@Ivan:好吧,这离主题越来越远了,真是可笑P海事组织:每个周期都很重要。你不同意。我将不得不使用“无论如何”,deal?断点最终确实开始工作了(在这场磨难之后,取消选中“Lazy load symbols”复选框……这是我在每次新安装时都会忘记的事情;我希望这不是默认设置)。问题似乎更多的是,我正在使用的图形库(SFML)在我从计时器调用其draw和update调用时,在我现有的运行循环中启动自己的运行循环(这样做是为了不阻止本机UI元素)。这混淆了Cocoa和调试,但我的内存使用量并没有像我预期的那样激增,所以这可能是我可以通过这个(内部开发工具)解决的问题。这为我解决了问题。在我使用performSelectorInBackground调用的方法(选择器)中,我必须将主体包装在NSAutoreleasePool中。我发现将NSDeallocateZombies保留为NO最有用。否则,它们将被释放!然后他们就不能为他们的“僵尸”功能服务了。如果内存完全耗尽,将其设置为“是”是一种临时补丁。
// Functions used as interesting breakpoints in a debugger
// void __NSAutoreleaseNoPool(void *object);
        // Called to log the "Object X of class Y autoreleased with no
        // pool in place - just leaking" message.  If an environment
        // variable named "NSAutoreleaseHaltOnNoPool" is set with string
        // value "YES", the function will automatically break in the
        // debugger (or terminate the process).

// void __NSAutoreleaseFreedObject(void *freedObject);
        // Called when a previously freed object would be released
        // by an autorelease pool.  If an environment variable named
        // "NSAutoreleaseHaltOnFreedObject" is set with string value
        // "YES", the function will automatically break in the debugger
        // (or terminate the process).