2010-07-12 30 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);