Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Как узнать принадлежит ли область памяти программе


Автор: KaraKum 24.7.2009, 10:59
Доброе время суток.
Есть ли возможность узнать принадлежит ли память программе по имеющемуся указателю?

Автор: xvr 24.7.2009, 11:33
Можно. Поставить ловушку на SEGV и прочесть память по указателю. Если сигнала не последовало - то принадлежит

Автор: azesmcar 24.7.2009, 11:37
Зачем это нужно если не секрет?

Автор: KaraKum 24.7.2009, 12:57
Для отладки иногда нужно узнать при использовании какого указателя возникает "segmentation fault".

Автор: azesmcar 24.7.2009, 12:59
Ну вариант xvr подходит. А вообще - дебагером не лучше?

Автор: MAKCim 24.7.2009, 22:31
Цитата(xvr @  24.7.2009,  11:33 Найти цитируемый пост)
Поставить ловушку на SEGV и прочесть память по указателю. Если сигнала не последовало - то принадлежит

а если адрес пренадлежит метаданным аллокатора? ;)

Автор: xvr 27.7.2009, 12:00
Цитата(MAKCim @ 24.7.2009,  22:31)
Цитата(xvr @  24.7.2009,  11:33 Найти цитируемый пост)
Поставить ловушку на SEGV и прочесть память по указателю. Если сигнала не последовало - то принадлежит

а если адрес пренадлежит метаданным аллокатора? ;)

Вроде как 'метаданные аллокатора' тоже принадлежат 'программе', так что условия исходного вопроса выполняются.
Если хочется большего - можно прилинковать к себе valgrind и спрашивать у него (только не спрашивайте у меня - как  smile )

Автор: MAKCim 27.7.2009, 13:30
Цитата(xvr @  27.7.2009,  12:00 Найти цитируемый пост)
Вроде как 'метаданные аллокатора' тоже принадлежат 'программе'

программа - это то, что передается в execve
аллокатор - это libc. т. е не программа  smile 

Автор: xvr 27.7.2009, 13:43
Цитата(MAKCim @ 27.7.2009,  13:30)
Цитата(xvr @  27.7.2009,  12:00 Найти цитируемый пост)
Вроде как 'метаданные аллокатора' тоже принадлежат 'программе'

программа - это то, что передается в execve
аллокатор - это libc. т. е не программа  smile

Ааа, в этом смысле  smile Тогда на попадание в САМ аллокатор - в map программы (через /proc/self/maps), а если надо именно ДАННЫЕ, то к терапев valgrind  smile 

Автор: KaraKum 29.7.2009, 00:18
Ведь для каждого работающего приложения есть таблица, описывающая участки памяти, которые принадлежат программе. Должен быть способ как-то эту таблицу прочитать.
Например в valgrind в конце проверки сообщается о том сколько памяти "окончательно потеряно", сколько "possibly lost" и так далее - вероятно он эту таблицу и читает и сверяет с имеющимися в программе указателями. Я правильно понимаю?

Автор: xvr 29.7.2009, 11:39
Цитата(KaraKum @ 29.7.2009,  00:18)
Ведь для каждого работающего приложения есть таблица, описывающая участки памяти, которые принадлежат программе. 

Есть такая таблица
Цитата

Должен быть способ как-то эту таблицу прочитать.
Угу, читать /proc/self/maps
Цитата

Например в valgrind в конце проверки сообщается о том сколько памяти "окончательно потеряно", сколько "possibly lost" и так далее - вероятно он эту таблицу и читает и сверяет с имеющимися в программе указателями. Я правильно понимаю?
Нет, он подменяет менеджер кучи (malloc/free/etc), и определяет куски, которые были запрошенны (malloc), но не возвращены (free)

Автор: KaraKum 29.7.2009, 11:59
Цитата(xvr @ 29.7.2009,  12:39)
Цитата

Должен быть способ как-то эту таблицу прочитать.
Угу, читать /proc/self/maps

maps - это файл? У меня он почему-то пустой.

Автор: xvr 30.7.2009, 11:24
Цитата(KaraKum @ 29.7.2009,  11:59)
Цитата(xvr @ 29.7.2009,  12:39)
Цитата

Должен быть способ как-то эту таблицу прочитать.
Угу, читать /proc/self/maps

maps - это файл? 

Файл

Цитата

У меня он почему-то пустой.



Код

> cat /proc/self/maps

00400000-00405000 r-xp 00000000 08:03 110240                             /bin/cat
00504000-00505000 rw-p 00004000 08:03 110240                             /bin/cat
00505000-00526000 rwxp 00505000 00:00 0 
2a95556000-2a95557000 rw-p 2a95556000 00:00 0 
2a95586000-2a95588000 rw-p 2a95586000 00:00 0 
2a95588000-2a983d1000 r--p 00000000 08:05 1028442                        /usr/lib/locale/locale-archive
35f8700000-35f8715000 r-xp 00000000 08:03 78964                          /lib64/ld-2.3.4.so
35f8814000-35f8816000 rw-p 00014000 08:03 78964                          /lib64/ld-2.3.4.so
35f8b00000-35f8c2b000 r-xp 00000000 08:03 78965                          /lib64/tls/libc-2.3.4.so
35f8c2b000-35f8d2b000 ---p 0012b000 08:03 78965                          /lib64/tls/libc-2.3.4.so
35f8d2b000-35f8d2d000 r--p 0012b000 08:03 78965                          /lib64/tls/libc-2.3.4.so
35f8d2d000-35f8d30000 rw-p 0012d000 08:03 78965                          /lib64/tls/libc-2.3.4.so
35f8d30000-35f8d34000 rw-p 35f8d30000 00:00 0 
7fbfffe000-7fc0000000 rw-p 7fbfffe000 00:00 0 
ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0 


Автор: KaraKum 30.7.2009, 13:39
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)