gpt4 book ai didi

objective-c - gdb 中的 nil 未定义为 0x0?

转载 作者:太空狗 更新时间:2023-10-30 03:59:12 25 4
gpt4 key购买 nike

我正在使用 gdb(在 Xcode 内部)逐步执行一些简单的 Objective-C 代码,并注意到一些奇怪的事情。这是相关的片段:

NSString *s = nil;
int x = (s == nil);

如我所料,这两行之后的 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>

除了 objective-C 使用的 (0x0) 之外,gdb 似乎对 nil 有一些定义。有人可以解释这里发生了什么吗?

最佳答案

当你的代码被编译时,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 */

那么,gdb 在运行时获取的nil 是从哪里来的呢?您可以从 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.

不出所料,它的值是 0:

(gdb) p *(long *)nil
$2 = 0
(gdb) x/xg nil
0x20c49ba5da6428 <nil>: 0x0000000000000000

这个变量从何而来? GDB 可以告诉我们:

(gdb) i shared nil
3 Foundation F - init Y Y /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation at 0x20c49ba5bb2000 (offset 0x20c49ba5bb2000)

确实,当我们检查 Foundation 中定义的符号时,我们发现 nil:

$ nm -m /System/Library/Frameworks/Foundation.framework/Foundation | grep nil$
00000000001f4428 (__TEXT,__const) external _nil

关于objective-c - gdb 中的 nil 未定义为 0x0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4130325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com