2010-07-12 85 views
2

我将一个不精确的垃圾收集器从Windows移植到MacOS X中。在它中,它必须扫描堆栈以识别堆中的潜在指针,然后将这些指针用作GC根。要做到这一点,我需要堆栈的基础以及它的长度。在Windows中,该代码使用类似于这里描述的是一个算法:如何在MacOS X上找到堆栈的基址和大小?

Stack and Stack Base Address

我怎么做,在Mac OS X?请注意,目前,我只关心主线程。使用此GC的解释程序是单线程的,我可以保证其他线程上不存在任何参考。/

回答

0

Hans Boehm's conservative GC for C在MacOS X上运行,并且是开源的。所以你可以想象看看GC的源代码,看看它如何定位堆栈。或者,根据您控制调用代码的多少,您可以简单地将某个本地变量的地址设置为“高”(例如,在main()函数或其MacOS X等效项中,或者在相关的启动函数中线)。可能,您可能只需要选择线程创建时的堆栈地址和大小(使用Posix线程,这是通过pthread_attr_setstack() - Posix线程可以与MacOS X一起使用)。

2

你也可以得到堆栈的总大小和长度与特定达尔文功能:

pthread_t self = pthread_self(); 
    void* addr = pthread_get_stackaddr_np(self); 
    size_t size = pthread_get_stacksize_np(self); 
    printf("addr=%p size=%zx\n", addr, size);