Во-первых, вы можете иметь несколько стеков в вашем process, в частности, если она является многопоточной (и некоторые библиотеки могут начинать темы, если вы не просите их). И ваш процесс «virtual address space может иметь больше сегментов, чем просто куча & стек.
Вы можете разобрать псевдо-файл /proc/self/maps
. См. proc(5). Обратите внимание, что поскольку это псевдофайл, который генерируется ядром, нет физического ввода-вывода, и чтение & синтаксического анализа того, что файл /proc/self/maps
должен быть очень быстрым.
адрес карты вашего процесса можно изменить, вызвав mmap(2), munmap
, execve
, mprotect
и некоторые другие системные вызовы (см syscalls(2) , чтобы получить список из них); используйте strace(1), чтобы понять, какие системные вызовы выполнены. Любой вызов malloc
(внутренне вызываемый многими функциями, включая fopen
...) или free
(и до dlopen
и т. Д. И т. Д.) может (но не всегда) использовать их, поэтому кэширование результата разбора /proc/self/maps
не является надежным вариантом.
Попробуйте сначала команду cat /proc/$$/maps
в терминале (показывая вам описание виртуального адресного пространства вашей оболочки).
Как многие прокомментировали, из-за ASLR вы не имеете представления об относительном положении стека и кучи, даже если есть один стек. Возможным трюком может быть запуск вашего main
с чем-то, помещающим адрес некоторой локальной переменной (или даже main
argc
первый аргумент, или argv[0]
) в некотором глобальном void*stackbottom;
, а затем сравнить адрес, как вы, то есть тест if(&a < addr && &a > stackbottom)
. Обратите внимание, что Boehm's garbage collector выполняет аналогичные действия.
Но самый надежный способ для чтения и анализа /proc/self/maps
, и это должно быть довольно быстро и, безусловно, является программным решением (ядро динамически дает информацию о своем состоянии и состоянии процесса через /proc/
и не физического IO участвует в чтении).
И все же, быть в стеке или находиться в куче слабовыраженной свойство указателей (другими словами, стек или куча является гораздо более сложным понятием, чем то, что вы себе представить). Вы должны быть более точными о том, что вы действительно хотите сделать.
В дополнение, переопределите свои собственные malloc
, free
и т. Д. И у вас есть malloc
управляйте некоторой картой памяти.
Почему именно вы спрашиваете? –
[См. ASLR] (https://en.wikipedia.org/wiki/Address_space_layout_randomization). – user3386109
@BasileStarynkevitch :-) Потому что я вижу, что он разбит на некоторых платформах (все Linux с незначительными изменениями). – joe