nil in gdb is not defined as 0x0?(gdb 中的 nil 未定义为 0x0?)
问题描述
我正在使用 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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:gdb 中的 nil 未定义为 0x0?
基础教程推荐
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01