Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стек. Получение размера стека процесса. Максимальный и текущий размер стека 
:(
    Опции темы
GoldFinch
Дата 26.8.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



MuForum, максимальный размер стека, не меняется если его не менять smile  а задается он при компиляции программы
а чтобы определить размеры стеков каждого потока, надо очевидно их перечислить (Thread32First/Thread32Next)
можно получить esp из контекста каждого потока: OpenThread/GetThreadContext
но где брать границы их стеков я не знаю. Разве что выполнять свой код с контексте каждого потока чтобы получить TEB, но наверное список TEB можно получить както еще.
PM MAIL ICQ   Вверх
GoldFinch
Дата 26.8.2009, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



на самом деле все просто:
NtQueryInformationThread с классом ThreadBasicInformation позволяет получить структуру THREAD_BASIC_INFORMATION в которой есть указатель на TEB, TebBaseAddress, откуда можно получить границы стека (база и максимальный размер).
Тогда надо посчитать разницу между вершиной стека (база+макс_размер) и esp (который можно получить из контекста потока), это будет текущий размер всех данных в стеке.
Однако для определения размера памяти которая выделена под стек, надо перебрать страницы стека, начиная с его базы, до первой страницы с флагом COMMITED.
PM MAIL ICQ   Вверх
GremlinProg
Дата 28.8.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



тогда уж лучше всего использовать CRT и получить базу стека так, как это делает crtexe.c:
Код

((PNT_TIB)NtCurrentTeb())->StackBase;

это вершина стека

код более-менее переносим, и есть некоторая гарантия, что поддержка CRT будет периодически делать апгрейд для NtCurrentTeb


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
DrHex
Дата 28.8.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



Максимальный размер стека узнать наверника не возможно(можно только предпологать). Так происходят случае когда стек не вылитает(переполнения стека) а происходит выход за границу стека, то и есть стек это виртуальная память, так как она не прерывна, то есть возможноть что после конца стека(конец памяти, которую выделал системный загрузчик) будет следующий буфер(то и есть валидная память).

Так что есть вариант, очень простой, а именно ставим хук(лучше не виндовский) на создание потока, получаем максимальный размер стека. 
Ну а вот что на счет статистики, то сдесь вопрос сложнее все зависит от конкретики.

1) Если требуется только текущее состояние потока то читай GoldFinch

2) Если требуется полное состояние(то и есть история) я имею ввиду пик стека, средние значения и так далее, то это сложнея
    - CreateProcess(с параметром DEBUG)
   - Цикл дебагера 
   -  Дизассемблер длин()
   - Ставим бряки на calls(так как раскрутка стека почти всегда в начали функции)
   - И бряку на создания потоков(хоть и приходит сообщения(в цикле дебагинга), но там кажется нельзя получить стек потока )

Вообщем все довольно просто......
--------------------
google.com и это все.
PM MAIL   Вверх
GremlinProg
Дата 28.8.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(DrHex @  28.8.2009,  12:47 Найти цитируемый пост)
Максимальный размер стека узнать наверника не возможно(можно только предпологать)

DrHex, перечитай тему, т.к. мы уже давно выяснили, что сделать это можно
Цитата(DrHex @  28.8.2009,  12:47 Найти цитируемый пост)
то есть возможноть что после конца стека(конец памяти, которую выделал системный загрузчик) будет следующий буфер(то и есть валидная память).

смотря что понимать под "концом стека", верхний или нижний?
вверху стоит сторож в виде одной страницы, а внизу - стек потому и распределется сразу, чтобы внизу были неиспользуемые приложением страницы,
хотя, учитывая, что куча идет первой, внизу таки есть критическая зона, только при чем тут определение размеров стека?

а в остальном, я так и не понял, что ты хотел сказать,
т.к. язык которым ты пользуешься к программному не относится,
а по-человечески у тебя сформулировать ни мысль ни план не получилось,
и при чем тут дебагер, или ты предлагаешь писать отладчик чтобы собирать статистику по стеку?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 28.8.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26




Модератор: Сообщение скрыто.

PM MAIL ICQ   Вверх
GremlinProg
Дата 28.8.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(GremlinProg @  28.8.2009,  13:14 Найти цитируемый пост)
вверху стоит сторож в виде одной страницы

скорее всего сторож стоит таки внизу (не дотягивает он вверху на страницу)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Lycifer
Дата 28.8.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



GremlinProg  что не понятного???


Цитата

и при чем тут дебагер, или ты предлагаешь писать отладчик чтобы собирать статистику по стеку?


Можно взять готовый отладчик....


Цитата

- CreateProcess(с параметром DEBUG)
   - Цикл дебагера 
   -  Дизассемблер длин()
   - Ставим бряки на calls(так как раскрутка стека почти всегда в начали функции)
   - И бряку на создания потоков(хоть и приходит сообщения(в цикле дебагинга), но там кажется нельзя получить стек потока )

GremlinProg  - и это  отладчик?????
 - Без пользовательского интерфейса(точнее вообще без управлением отладчиком)
 - Без возможности трасировки(пошаговой и так далее).
 - Без загрузки символом
 - Без полного дизассембилирования
 - и еще пунктов 100-200.

И так это часть отладчика.

А какой другой вариант собирать полную статистику??????

Отладочное апи требуется для того что бы была возможность собирать инфу. (специально для GremlinProg  такая информация как раскрутка стека, то и есть вычисление пика, среднее значения, какие потоки были запущенны и с каким размером стека)

<...скрыто...>

M
GremlinProg
обсуждать лично меня можно в книге жалоб, а здесь не стоит лепить этот импровизированный сломаный телефон, DrHex нарушил правила дважды и это было не здесь


Это сообщение отредактировал(а) GremlinProg - 28.8.2009, 18:15
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0730 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.