Как мне найти базовый адрес и размер стека в MacOS X? - PullRequest
2 голосов
/ 12 июля 2010

Я портирую неточный сборщик мусора из Windows на MacOS X. В нем он должен сканировать стек, чтобы определить потенциальные указатели в куче, а затем использовать их в качестве корней GC.Для этого мне нужна база стека, а также его длина.В Windows этот код использует алгоритм, аналогичный описанному здесь:

Стек и базовый адрес стека

Как мне это сделать в Mac OS X?Обратите внимание, что на данный момент я забочусь только о главном потоке.Интерпретатор, который использует этот GC, является однопоточным, и я могу гарантировать, что в других потоках нет ссылок ./

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Вы также можете получить общий размер и длину стека с помощью функций, специфичных для Дарвина:

    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);
0 голосов
/ 23 июля 2010

Консервативный GC Ханса Бёма для C работает на MacOS X и имеет открытый исходный код.Таким образом, вы могли бы взглянуть на исходный код этого GC, чтобы увидеть, как он находит стек.

В качестве альтернативы, в зависимости от того, насколько вы управляете вызывающим кодом, вы можете просто взять адрес локальной переменнойгде-то «высокий» (например, в функции main() или ее эквиваленте в MacOS X или в функции запуска для соответствующего потока).Возможно, вы сможете просто выбрать адрес и размер стека при создании потока (с потоками Posix это делается с pthread_attr_setstack() - потоки Posix можно использовать с MacOS X).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...