Dav*_*ill 4 null gdb objective-c
我正在使用gdb(Xcode内部)单步执行一些简单的Objective-C代码并注意到一些奇怪的东西.这是相关的片段:
NSString *s = nil;
int x = (s == nil);
Run Code Online (Sandbox Code Playgroud)
正如我所料,x这两行之后的价值是1.奇怪的是,如果我在gdb中尝试类似的东西,它不会起作用:
(gdb) print ret
$1 = (NSString *) 0x0
(gdb) print (int)(ret==nil)
$2 = 0
(gdb) print nil
$3 = {<text variable, no debug info>} 0x167d18 <nil>
Run Code Online (Sandbox Code Playgroud)
似乎gdb对于nil有一些定义,而不是Objective-C使用的(0x0).有人能解释一下这里发生了什么吗?
在编译代码时,nil预处理器常量被定义为__null(一个特殊的GCC变量,用作NULL)0L,或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 */
Run Code Online (Sandbox Code Playgroud)
那么,nilgdb在运行时选择的来源是什么?您可以从消息中看出gdb给出的nil是位于该地址的变量的名称:
(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.
Run Code Online (Sandbox Code Playgroud)
不出所料,它的价值证明是0:
(gdb) p *(long *)nil
$2 = 0
(gdb) x/xg nil
0x20c49ba5da6428 <nil>: 0x0000000000000000
Run Code Online (Sandbox Code Playgroud)
这个变量来自哪里?GDB可以告诉我们:
(gdb) i shared nil
3 Foundation F - init Y Y /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation at 0x20c49ba5bb2000 (offset 0x20c49ba5bb2000)
Run Code Online (Sandbox Code Playgroud)
实际上,当我们检查基金会中定义的符号时,我们发现nil:
$ nm -m /System/Library/Frameworks/Foundation.framework/Foundation | grep nil$
00000000001f4428 (__TEXT,__const) external _nil
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1235 次 |
| 最近记录: |