首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gnustep/linux "hello world“核心转储

gnustep/linux "hello world“核心转储
EN

Stack Overflow用户
提问于 2014-01-15 23:30:48
回答 1查看 183关注 0票数 0

我跟踪了this gnustep setup

源包含几乎为空的自动释放池。如果没有它,应用程序就会像标准c一样工作。

代码语言:javascript
复制
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        NSLog(@"Hello, World!");
    }

    return 0;
}

制作:

代码语言:javascript
复制
CC=clang
CXX=clang++

OPT_RELEASE=-O3 
OPT_DEBUG=-DDEBUG -g

INCLUDE=-I.
LIBRARY= -L/usr/local/lib

CFLAGS=`gnustep-config --objc-flags`  -fobjc-runtime=gnustep
LDFLAGS=`gnustep-config --base-libs` -fobjc-runtime=gnustep

SOURCES= hello.m

OBJECTS=$(SOURCES:.m=.o)

DEPENDENCIES=$(SOURCES:.m=.d)

EXECUTABLE=hello    

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
        $(CC) $(LIBRARY) $(LDFLAGS) $(OBJECTS) $(STATICLIBS) -o $@

%.o: %.m
    $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@

clean:
   rm -rf $(OBJECTS) $(EXECUTABLE) $(DEPENDENCIES) core

核心:

代码语言:javascript
复制
#0  0x0000000000000000 in ?? ()
#1  0x00007ffff71f5c06 in objc_autoreleasePoolPop () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#2  0x00007ffff7716753 in -[NSAutoreleasePool emptyPool] (self=0x77dd30, _cmd=0x7ffff7cf5010 <.objc_selector_list+128>) at NSAutoreleasePool.m:411
#3  0x00007ffff77168c4 in -[NSAutoreleasePool dealloc] (self=0x77dd30, _cmd=0x7ffff7cf4fa0 <.objc_selector_list+16>) at NSAutoreleasePool.m:729
#4  0x00007ffff771686c in -[NSAutoreleasePool release] (self=0x77dd30, _cmd=0x7ffff7cfc3c0 <.objc_selector_list+240>) at NSAutoreleasePool.m:722
#5  0x00007ffff7728ca9 in +[NSCalendarDate initialize] (self=0x7ffff7cfc1e0 <_OBJC_CLASS_NSCalendarDate>, _cmd=0x63b470) at NSCalendarDate.m:380
#6  0x00007ffff71e5e93 in objc_send_initialize () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#7  0x00007ffff71f3199 in objc_msg_lookup_sender () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#8  0x00007ffff71f2eb7 in slowMsgLookup () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#9  0x00007ffff71f5048 in objc_msgSend_fpret () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#10 0x00007ffff776d4c6 in +[NSDate initialize] (self=0x7ffff7d0afe0 <_OBJC_CLASS_NSDate>, _cmd=0x63b470) at NSDate.m:134
#11 0x00007ffff71e5e93 in objc_send_initialize () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#12 0x00007ffff71f3199 in objc_msg_lookup_sender () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#13 0x00007ffff71f2eb7 in slowMsgLookup () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#14 0x00007ffff71f5048 in objc_msgSend_fpret () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#15 0x00007ffff78cdb30 in +[NSUserDefaults initialize] (self=0x7ffff7d7b4a0 <_OBJC_CLASS_NSUserDefaults>, _cmd=0x63b470) at NSUserDefaults.m:563
#16 0x00007ffff71e5e93 in objc_send_initialize () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#17 0x00007ffff71f3199 in objc_msg_lookup_sender () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#18 0x00007ffff71f2eb7 in slowMsgLookup () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#19 0x00007ffff71f5048 in objc_msgSend_fpret () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#20 0x00007ffff780c632 in +[NSObject initialize] (self=0x7ffff7d3c460 <_OBJC_CLASS_NSObject>, _cmd=0x63b470) at NSObject.m:1144
#21 0x00007ffff71e5e93 in objc_send_initialize () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#22 0x00007ffff71e5b06 in objc_send_initialize () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#23 0x00007ffff71f3199 in objc_msg_lookup_sender () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#24 0x00007ffff71f2eb7 in slowMsgLookup () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#25 0x00007ffff71f5048 in objc_msgSend_fpret () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#26 0x00007ffff71f58df in initAutorelease () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#27 0x00007ffff71f56ad in objc_autoreleasePoolPush () from /usr/GNUstep/Local/Library/Libraries/libobjc.so.4.6
#28 0x0000000000400a14 in main (argc=1, argv=0x7fffffffdbe8) at hello.m:5
EN

回答 1

Stack Overflow用户

发布于 2014-01-16 05:50:29

所以这是我的研究结果:

DeleteAutoreleasePool在libobjc2(arc.m)中声明为IMP,如果在NSAutoreleasePool.m asePool.m中找不到有效的arc自动释放池,则从objc_autoreleasePoolPop调用。

使用clang的实际版本,NSAutoreleasePool可以正确检测释放池的可用性。(在capabilities.h中声明)

这就解释了NSAutoreleasePool工作的原因。

作为返回,arc.m将读取此结果。如果结果是肯定的,它什么也不做,否则它从NSAutoreleasePool调用引用计数方法(这样就可以使用GCC和其他编译器)。

这个过程中的一个缺陷可以在initAutorelease(arc.m)中找到。在这里,使用class_respondsToSelector.检测自动释放池的可用性换句话说,一个类方法被用作功能标志(sigh)。

验证后的方法定义如下:

代码语言:javascript
复制
#ifdef ARC_RUNTIME
...

/**
 * Indicate to the runtime that we have an ARC-compatible implementation of
 * NSAutoreleasePool and that it doesn't need to bother creating objects for   
 * pools.
*/
- (void)_ARCCompatibleAutoreleasePool {}
#else

此函数的问题是:

  • 它什么也不做。
  • 它什么也不返回。

即使启用了debug,我也希望这个函数在编译期间被忽略,也不会作为库调用导出。

这就解释了为什么obj-arc (@autoreleasepool)不能与clang 3.4+一起使用。

如果您只将clang用于您的objc项目,则可以重写或简单地停用此检测方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21141546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档