如何打破__NSAutoreleaseNoPool

Tyr*_*rus 10 debugging macos

我好心满意

***__NSAutoreleaseNoPool():类NSEvent的对象0x1961180自动释放,没有池到位 - 只是泄漏

在运行期间发出警告,并且不知道原因是什么.粗略谷歌表示这是我可以用Xcode打破的符号,但是通过运行>管理断点>添加符号断点,或者只是通过断点管理窗口将其添加为符号断点,会产生一个断点,旁边有一个 - 而不是检查,我认为它是一个无法找到的符号.

我尝试添加带有两个下划线,一个下划线的符号"__NSAutoreleaseNoPool",现在我感觉很愚蠢.错误继续被记录,没有断点被击中.任何打破Obj-C符号或调试它的指针都将受到赞赏.

[编辑:大概10(10多个,所以总共几十个,包括至少两个Xcode重启)运行我得到"待断点9 - "_ _ NSAutoreleaseNoPool"已解决"打印到我的控制台,断点开始工作.有没有办法强制挂起的断点实际解决?]

Sco*_*rks 25

要真正回答您的问题,请查看NSDebug.h.在那里你会发现一个评论,这是其中的一部分:

NAME OF ENV. VARIABLE                  DEFAULT  SET TO...
NSDebugEnabled                            NO    "YES"
NSZombieEnabled                           NO    "YES"
NSDeallocateZombies                       NO    "YES"
NSHangOnUncaughtException                 NO    "YES"
Run Code Online (Sandbox Code Playgroud)

这些评论更进一步:

// 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).
Run Code Online (Sandbox Code Playgroud)

所以你真的不需要设置这些断点; 只需设置适当的环境变量.你可以做后者无论是从您如.bashrc或在Xcode 4您可以编辑你的"方案"中的"运行"部分,并将他们那里-这就是我做的,它工作得很好.


小智 5

我在__NSAutoreleaseNoPool()上设置断点时遇到了同样的问题.我终于成功设置了断点使用gdb命令.调试器启动后,在调试器控制台中按ctrl + C. 使用"br __NSAutoreleaseNoPool"设置断点并重新启动调试器.


Wil*_*and 1

这里的问题很简单:您在没有池的情况下进行释放。这通常发生在针对 Foundation 编写的命令行工具中。只需将以下代码添加到您的main():(省略无关部分)

\n\n
int main (\xe2\x80\xa6) {\n  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\n  /// Your code goes here.\n\n  [pool drain]; // This one might not strictly speaking be neccessary.\n  [pool release];\n\n   return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:如果您没有创建命令行工具,那么您很可能正在做一些顽皮的事情;但尽管如此:如果您之前调用了代码NSApplicationMain(),则需要将其包装在相同的基本代码中,在调用之前耗尽并释放池NSApplicationMain

\n