我正在使用 gdb(在 Xcode 内部)逐步完成一些简单的 Objective-C 代码,并注意到一些奇怪的东西.这是相关的片段:
I was stepping through some simple Objective-C code with gdb (inside of Xcode) and noticed something strange. Here is the relevant snippet:
NSString *s = nil; int x = (s == nil);正如我所料,这两行之后x的值是1.奇怪的是,如果我在 gdb 中尝试类似的东西,它就不一样了:
As I'd expect, the value of x after these two lines is 1. Strangely, if I try something similar in gdb, it doesn't work the same:
(gdb) print ret $1 = (NSString *) 0x0 (gdb) print (int)(ret==nil) $2 = 0 (gdb) print nil $3 = {<text variable, no debug info>} 0x167d18 <nil>似乎 gdb 对 nil 有一些定义,而不是 Objective-C 使用的 (0x0).有人能解释一下这里发生了什么吗?
It seems like gdb has some definition for nil other than what objective-C uses (0x0). Can someone explain what's going on here?
推荐答案当你的代码被编译时,nil 是一个预处理器常量,定义为 __null (a用作 NULL)、0L 或 0 的特殊 GCC 变量:
When your code is being compiled, nil is a preprocessor constant defined to be either __null (a special GCC variable that serves as NULL), 0L, or 0:
<objc/objc.h> #ifndef nil #define nil __DARWIN_NULL /* id of Nil instance */ #endif <sys/_types.h> #ifdef __cplusplus #ifdef __GNUG__ #define __DARWIN_NULL __null #else /* ! __GNUG__ */ #ifdef __LP64__ #define __DARWIN_NULL (0L) #else /* !__LP64__ */ #define __DARWIN_NULL 0 #endif /* __LP64__ */ #endif /* __GNUG__ */ #else /* ! __cplusplus */ #define __DARWIN_NULL ((void *)0) #endif /* __cplusplus */那么,gdb 在运行时获取的 nil 是从哪里来的呢?您可以从 gdb 给出的消息中看出 nil 是位于该地址的变量的名称:
So, where does the nil that gdb picks up at runtime come from? You can tell from the message gdb gives that nil is the name of a variable located at that address:
(gdb) p nil $1 = {<text variable, no debug info>} 0x20c49ba5da6428 <nil> (gdb) i addr nil Symbol "nil" is at 0x20c49ba5da6428 in a file compiled without debugging.不出所料,它的值是0:
(gdb) p *(long *)nil $2 = 0 (gdb) x/xg nil 0x20c49ba5da6428 <nil>: 0x0000000000000000这个变量从何而来?GDB 可以告诉我们:
Where does this variable come from? GDB can tell us:
(gdb) i shared nil 3 Foundation F - init Y Y /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation at 0x20c49ba5bb2000 (offset 0x20c49ba5bb2000)确实,当我们检查Foundation中定义的符号时,我们发现nil:
Indeed, when we check the symbols defined in Foundation, we find nil:
$ nm -m /System/Library/Frameworks/Foundation.framework/Foundation | grep nil$ 00000000001f4428 (__TEXT,__const) external _nil更多推荐
gdb 中的 nil 未定义为 0x0?
发布评论