Pamiêc zajmowana przez program



Widzisz wersję archiwalną tematu "Pamiêc zajmowana przez program" z forum pl.comp.programming





MZet - 13 Kwi 2005, 13:05

Witam

Mam do Was takie pytanie: jak wykryc, które dokładnie komórki pamięci
zajmuje konkretny proces w systemie? W miarę możliwości proszę o
obszerniejsze wskazówki (jestem newbie w tym zakresie). Przykłady itp. mogą
byc w zasadzie w każdym języku, najlepiej w VB lub w C++, ale nie pogardzę
innymi.

Z góry dziękuję
MZet



Jacek Czerwinski - 13 Kwi 2005, 13:09


Witam

Mam do Was takie pytanie: jak wykryc, które dokładnie komórki pamięci
zajmuje konkretny proces w systemie? W miarę możliwości proszę o
obszerniejsze wskazówki (jestem newbie w tym zakresie). Przykłady itp. mogą
byc w zasadzie w każdym języku, najlepiej w VB lub w C++, ale nie pogardzę
innymi.



W celu zapoznania z tematem proponuje dwa większe gwoździe do prawej i
lewej ręki i gniazdko 220V


Zbyszek Malec - 13 Kwi 2005, 13:10


Mam do Was takie pytanie: jak wykryc, które dokładnie komórki pamięci
zajmuje konkretny proces w systemie? W miarę możliwości proszę o
obszerniejsze wskazówki (jestem newbie w tym zakresie). Przykłady
itp. mogą byc w zasadzie w każdym języku, najlepiej w VB lub w C++,
ale nie pogardzę innymi.



Pytanie sugeruje że nie bardzo orientujesz się w sposobie reprezentacji
danych w pamięci komputera. Sugerowalbym najpierw poczytać o tym
zagadnieniu. Szukaj pod hasłem pamięć wirtualna, stronicowanie,
relokacja. Nie wiem co jeszcze.

Powiedz co chcesz zrobić, a może da się to zrobić inaczej.


Bernard - 13 Kwi 2005, 14:42


Witam

Mam do Was takie pytanie: jak wykryc, które dokładnie komórki pamięci
zajmuje konkretny proces w systemie? W miarę możliwości proszę o
obszerniejsze wskazówki (jestem newbie w tym zakresie). Przykłady itp. mogą
byc w zasadzie w każdym języku, najlepiej w VB lub w C++, ale nie pogardzę
innymi.



W zasadzie się nie da, chyba, że zmodyfikujesz jądro systemu. Wtedy też
się raczej nie da, bo program jest przemieszczany w pamięci w czasie
pracy. Jeśli chodzi Ci o adres wirtualny, to w C możesz wypisać dowolny
adres, np.

int i;

printf("%p%, &i);

- wypisze adres zmiennej i w postaci szesnastkowej.



sop3k - 13 Kwi 2005, 15:30

Witam

Mam do Was takie pytanie: jak wykryc, które dokładnie komórki pamięci
zajmuje konkretny proces w systemie? W miarę możliwości proszę o
obszerniejsze wskazówki (jestem newbie w tym zakresie). Przykłady itp. mogą
byc w zasadzie w każdym języku, najlepiej w VB lub w C++, ale nie pogardzę
innymi.



Ogolnie wyglada to tak.
Bierzesz mlotek do reki( najlepiej ciezki ) walisz sie w leb, a potem bierzesz  
ksiazke i zaczynasz wszytsko od nowa, moze nastepnym razem troche sie
zastanowisz zanmim wyslesz takie cus na grupe.

Oczywscie nie bierz tego do siebie.

Pozdro.


MZet - 15 Kwi 2005, 11:42

Jeżeli w C++ da się przypadkowo nadpisac pamięc poprzez wyjście poza zakres
tablicy (błąd słupka w płocie, tak to się nazywało... ?) to chyba da się
stwierdzi jakie komórki pamięci zajmuje jaki program, no nie?

Zbyszek Malec - 15 Kwi 2005, 14:44


Jeżeli w C++ da się przypadkowo nadpisac pamięc poprzez wyjście poza
zakres tablicy (błąd słupka w płocie, tak to się nazywało... ?) to
chyba da się stwierdzi jakie komórki pamięci zajmuje jaki program, no
nie?



To nie tylko o to chodzi.

MZet - 15 Kwi 2005, 15:03

To nie tylko o to chodzi.



Mów po polsku, a nie jakoś strasznie enigmatycznie :) Ostatnio uruchomiłem
narzędzie PView z Platform SDK Microsoftu i ono umie stwierdzic od jakiej
komórki zaczyna się konkretny proces. To może da się stwierdzic jakie są
pozostałe komórki?


Zbyszek Malec - 15 Kwi 2005, 20:16


Mów po polsku, a nie jakoś strasznie enigmatycznie :) Ostatnio
uruchomiłem narzędzie PView z Platform SDK Microsoftu i ono umie
stwierdzic od jakiej komórki zaczyna się konkretny proces. To może da
się stwierdzic jakie są pozostałe komórki?



Pamięć dostępna dla procesu na maszynie 32 bitowej to 4 GB niezależnie
od posiadanej pamięci fizycznej (no dobra, tyle to ma typowo adresów).
Proces dostaje jakąś pule adresów (owe 4 GB) i może sobie w tej
przestrzeni działać, a systemu zadaniem jest przemapowanie tego na
pamięć fizyczną (ewentualnie swap). Słowa kluczowe to właśnie pamięć
wirtualna i stronicowanie (chyba najpopularniejszy dzisiaj sposób
zarządzania pamięcią). W skrócie: nie da się odpowiedzieć na pytanie
"które komórki są zajmowane przez proces", jako że proces myśli, że ma
4GB pamięci na swój użytek. System wie, że to nieprawda, jednak nie
wyprowadza procesu z błedu aż do momentu kiedy zabraknie pamięci
fizycznej i swapa. Twój proces może być tak w pamięci fizycznej RAM jak
i np na dysku albo np w Londynie (bo dysponujemy rozproszonym systemem
operacyjnym który wymiótł nieużywane procesy gdzieś, gdzie mu nie będą
zawadzać) u pana Stasia.

MZet - 16 Kwi 2005, 03:26

W skrócie: nie da się odpowiedzieć na pytanie
"które komórki są zajmowane przez proces"



No dobra, a co np. z trainerami do gier? Świetnym przykładem jest tu Magic
Trainer - wybierasz proces i możesz modyfikowac dowolną wartośc dowolnej
komórki pamięci, zajmowanej przez ten proces. Możesz nawet wyszukiwac
konkretnych liczb. A więc działa, i to bardzo dobrze działa - pytanie tylko,
jak to jest zrobione... Na pewno jakaś funkcja API albo kombinacja kilku
funkcji, tylko sęk w tym jakich, i dlatego o to pytam. Inny przykład
trainera - Whisper.


Bernard - 16 Kwi 2005, 03:31



Pamięć dostępna dla procesu na maszynie 32 bitowej to 4 GB niezależnie
od posiadanej pamięci fizycznej (no dobra, tyle to ma typowo adresów).



Dla aplikacji max. 2 GB, a czasem 1 GB. Inaczej system nie mógły działać.

Proces dostaje jakąś pule adresów (owe 4 GB) i może sobie w tej
przestrzeni działać, a systemu zadaniem jest przemapowanie tego na



Nie. Proces dostaje kawałek z tych 2 GB. Trochę na dole (ale nie na
samym dole), trochę pośrodku i trochę na samej górze. Proces nie może
działać nigdzie indziej w obrębie "swoich" 2 GB, bo one są tylko
"potencjalne", a nie przydzielone. Statycznie przydzielona jest pamięć
na kod, dane statyczne i stos, zgodnie z treścią programu.

4GB pamięci na swój użytek. System wie, że to nieprawda, jednak nie
wyprowadza procesu z błedu aż do momentu kiedy zabraknie pamięci
fizycznej i swapa. Twój proces może być tak w pamięci fizycznej RAM jak



Owszem, wyprowadza bardzo boleśnie przy każdej próbie odwołania poza
przydzielony obszar. Natomiast jeśli już przydzieli, to dalej piszesz z
grubsza prawdę.
i np na dysku albo np w Londynie (bo dysponujemy rozproszonym systemem
operacyjnym który wymiótł nieużywane procesy gdzieś, gdzie mu nie będą
zawadzać) u pana Stasia.




Bernard - 16 Kwi 2005, 04:45


| W skrócie: nie da się odpowiedzieć na pytanie
| "które komórki są zajmowane przez proces"

No dobra, a co np. z trainerami do gier? Świetnym przykładem jest tu Magic
Trainer - wybierasz proces i możesz modyfikowac dowolną wartośc dowolnej
komórki pamięci, zajmowanej przez ten proces. Możesz nawet wyszukiwac
konkretnych liczb. A więc działa, i to bardzo dobrze działa - pytanie tylko,
jak to jest zrobione... Na pewno jakaś funkcja API albo kombinacja kilku
funkcji, tylko sęk w tym jakich, i dlatego o to pytam. Inny przykład
trainera - Whisper.



Zagadza się - "zajmowanej przez ten proces". Do tego służy intefejs
debugowania w Windows - ten sam, z którego korzystają debuggery.
Tyle że Twoje pytanie było zadane w taki sposób, że niewiele miało
wspólnego z tym, o czym piszesz - debugger nie zna i nie musi znać
położenia programu w pamięci, ma jedynie dostęp do jego przestrzeni
adresowej poprzez wywołania systemowe.

Twoje pytanie powinno brzmieć: "jak dostać się do przestrzeni adresowej
procesu?". A odpowiedź na nie brzmi: "użyj interfejsu debugowania
Windows". Nie wiem jak się go używa - nigdy nie pisałem debuggera pod
Windows. Zapewne można to odnaleźć w dokumentacji MSDN.


Zbyszek Malec - 16 Kwi 2005, 04:57


| Proces dostaje jakąś pule adresów (owe 4 GB) i może sobie w tej
| przestrzeni działać, a systemu zadaniem jest przemapowanie tego na

Nie. Proces dostaje kawałek z tych 2 GB.



Nie zrozumiałeś mnie. Proces dostaje te 2GB adresów do swojej dyspozycji
i ma je na swój wyłączny użytek. Innymi słowy ma prawo zaalokować
dowolnie dużo z tych 2GB, czy to w postaci stosu, sterty czy obszaru
danych statycznych. Nie twierdzę że na początku cała ta pamięć jest dla
niego od razu dostępna do zapisu czy odczytu, będzie dostępna po
zaalokowaniu jej przez program (new, malloc, push itp). Nie zmienia to
jednak faktu że ma do dyspozycji te 2GB pamięci.

W skrócie: dostaje tą 2GB pulę adresów i w jej obrębie może sobie
alokować ile wlezie (o ile nie nastąpi jakiś błąd, np. skończył się RAM
i swap itd), nie zważając na to, że  inne procesy mogą mieć inne dane
pod takim samym adresem .

Mam nadzieję że reszta mojej wypowiedzi w tym kontekście już jest jasna.


Bernard - 16 Kwi 2005, 07:52


Nie zrozumiałeś mnie. Proces dostaje te 2GB adresów do swojej dyspozycji
i ma je na swój wyłączny użytek. Innymi słowy ma prawo zaalokować
dowolnie dużo z tych 2GB, czy to w postaci stosu, sterty czy obszaru



Tylko sterty i to nie dowolnie dużo. Zwykle poniżej 1 GB. Kod, dane
statyczne i stos są alokowane statycznie przez system i proces nie ma na
to wpływu.

Mam nadzieję że reszta mojej wypowiedzi w tym kontekście już jest jasna.



Reszta jest jasna.


Tarasek Grzegorz - 17 Kwi 2005, 02:46

Witam
Nie jestem pewnien czy dokładnie o to chodzi ale to:
http://www.codeproject.com/threads/MDumpAll.asp może okazać sie pomocne.
Pozdrowienia

MZet - 17 Kwi 2005, 07:09

No dobra, a co z tym interfejsem debugowania? Znajdę jakieś porządne
przykłady oprócz MSDN? Może znacie jakiegoś opensource'owego trainera (MTC
nie ma otwartego kodu)? Byłbym bardzo wdzięczny za pomoc.

MZet


MZet - 17 Kwi 2005, 07:13

http://www.codeproject.com/threads/MDumpAll.asp Pozdrowienia



hmmm... Nawet niezłe, ale co z programami nie mającymi okien, działającymi w
tle? Proszę o więcej przykładów.


andrp - 17 Kwi 2005, 08:31

Tylko sterty i to nie dowolnie dużo. Zwykle poniżej 1 GB. Kod, dane
statyczne i stos są alokowane statycznie przez system i proces nie ma na
to wpływu.



A do czego służy opcja /BASE linkera jak nie do okreslenia adresu bazowego
procesu ?  Skoro tak, to nie system decyduje o miejscu umieszczenia kodu
procesu, ale informacja o tym umieszczona jest w binariach procesu.


Tarasek Grzegorz - 18 Kwi 2005, 07:29

MZet

No dobra, a co z tym interfejsem debugowania? Znajdę jakieś porządne
przykłady oprócz MSDN? Może znacie jakiegoś opensource'owego trainera (MTC
nie ma otwartego kodu)? Byłbym bardzo wdzięczny za pomoc.
MZet



Niestety nie tędy droga trajnery (przynajmniej te które widziałem) nie
wykorzystują funkcji debuggera (WaitForDebugEvent, ContinueDebugEvent) a
jedynie OpenProcess,  ReadProcessMemory, WriteProcessMemory itp. Jeżeli
jednak interesuje Cię bliższe zapoznanie sie z działaniem debuggera to
przykład (w MASM)  masz tutaj:
http://pancake.sggw.waw.pl/~hador/Masm32/Pl/pages/28.htm

MZet

| http://www.codeproject.com/threads/MDumpAll.asp Pozdrowienia
hmmm... Nawet niezłe, ale co z programami nie mającymi okien, działającymi w
tle? Proszę o więcej przykładów.



Nic prostrzego w podanym przykładzie wybieramy okno programu tylko po to
by później za pomocą funkcji GetWindowThreadProcessId pobrać ID Procesu. A
to przecież mżna zrobić za pomocą funkcji
CreateToolhelp32Snapshot Przykaład (w MASM) jej użycia najduje się min.
tutaj:
http://www.winapi.org/index.php?option=content&task=view&id=88&Itemid=33
Pozdrowienia


Tarasek Grzegorz - 18 Kwi 2005, 07:42

andrp

| Tylko sterty i to nie dowolnie dużo. Zwykle poniżej 1 GB. Kod, dane
| statyczne i stos są alokowane statycznie przez system i proces nie ma na
| to wpływu.
A do czego służy opcja /BASE linkera jak nie do okreslenia adresu bazowego
procesu ?  Skoro tak, to nie system decyduje o miejscu umieszczenia kodu
procesu, ale informacja o tym umieszczona jest w binariach procesu.



No tak ale nie wolno zapominać też, że czasem w starszych sysemach Windows
są wykorzystywane relokacje (mowa o sporadycznych przypadkach ale sekcja
reloc jest ciągle jeszcze obecna w exe budowanych przez niektóre
kompilatory)  więc jednak czasem system decyduje gdzie w pamięci umieścić
proces. Wiecej informacji na ten temat można znaleść w opisach budowy
plików w formacie PE.
Pozdro


Marcin 'Qrczak' Kowalczyk - 18 Kwi 2005, 08:00


A do czego służy opcja /BASE linkera jak nie do okreslenia adresu bazowego
procesu ?  Skoro tak, to nie system decyduje o miejscu umieszczenia kodu
procesu, ale informacja o tym umieszczona jest w binariach procesu.



To nie jest adres procesu w fizycznej pamięci, tylko adres danej
biblioteki w ramach pamięci procesu. Różne procesy mają różne
mapowania adresów na pamięć, tzn. to, co w jednym procesie jest
widoczne pod adresem X, niekoniecznie pokrywa się z innym procesem.

MZet - 18 Kwi 2005, 10:33

http://pancake.sggw.waw.pl/~hador/Masm32/Pl/pages/28.htm



Ten link nie działa... Może coś jeszcze? Jestem raczej newbie w tym
zakresie... I jeszcze jedno - skąd można ściągnąc dokumentację Win32 API
albo tylko tych funkcji, które wymieniłeś? Najlepiej po polsku :), ale po
angielsku nie zaszkodzi.


andrp - 18 Kwi 2005, 12:48

To nie jest adres procesu w fizycznej pamięci, tylko adres danej
biblioteki w ramach pamięci procesu.




bazowy.

Różne procesy mają różne
mapowania adresów na pamięć, tzn. to, co w jednym procesie jest
widoczne pod adresem X, niekoniecznie pokrywa się z innym procesem.



Ale jednak domyślnym adresem bazowym (w pamięci wirtualnej oczywiście) linkera
VC jest 0x00400000.  Pradowpodbnie więc większość programów pod Windowsem ma
właśnie taki adres bazowy.


Tarasek Grzegorz - 18 Kwi 2005, 15:03

MZet

| http://pancake.sggw.waw.pl/~hador/Masm32/Pl/pages/28.htm
Ten link nie działa... Może coś jeszcze? Jestem raczej newbie w tym
zakresie... I jeszcze jedno - skąd można ściągnąc dokumentację Win32 API
albo tylko tych funkcji, które wymieniłeś? Najlepiej po polsku :), ale po
angielsku nie zaszkodzi.



Dziwne u mnie działa bez problemu. Ale na wszelki wypadek podaję do strony
głównej: http://pancake.sggw.waw.pl/~hador/Masm32/Pl/index.html
A konkretnie chodziło mi o to:
Rozdział XXVIII
Funkcje uruchomieniowe Win32 API
Tam właśnie znajdują się przykłady (w MASM)  wykorzystania  wraz z opisem
funkcji związanych z debugowaniem. Przykład wykorzystania
ReadProcessMemory i WriteProcessMemory jest tu:
http://www.winapi.org/index.php?option=content&task=view&id=80&Itemid=33
a funkcji CreateToolhelp32Snapshot podającej informacje o uruchomionych
procesach, wątkach i załadowanych bibliotekach DLL wraz ze wszystkimi z
nią związanymi tutaj
http://www.winapi.org/index.php?option=content&task=view&id=88&Itemid=33
(ten link już chyba podawałem)
Niestety szczegółowej polskej dokumentacji dotyczącej tych funkcji chyba
nigdzie w sieci nie ma (prawdobodobnie dlatego, że są rzadko
wykorzystywane). Nawet nie znam książki w której by były one opisane :(
Wszystkie przyklady, które podalem  są w MASM ale da się je przetłumaczyć
na VC, Delphi, VB i każdy inny język w którym mozna korzystać z Win32 Api.
A podałem te akurat bo zawierały najlepsze polskie opisy jakie udalo mi
się znaleźć.
Czasem można coś przydatnego znaleźć w GOOGLE. :) Teraz gdy wiesz mniej
wicej czego szukać napewno coś znajdziesz. A w razie problemów z konkretną
funkcją to zawsze możesz zapytać, a ogólnie to raczej ciężko by było
odpowiadać bo to jest temat rzeka.
Co do dokumentacji angielskiej to Win32.hlp mozna ściągnąć np. z  
ftp://ftp.winapi.org/ plik nazywa się Win32.zip no i naszczęście jest MSDN
http://www.msdn.microsoft.com/
Pozdro

program źródłowy == kod źródłowy
albo program w pascalu :-) albo warunek :-(
Aplikacje sieciowe. Programowanie sieciowe dla poczatkujacego.
VC++ porada dla poczatkujacego z VC++ ale nie z programowaniem
  • piosenki na cymbalki nuty
  • prawa przeplywu ciepla
  • kernel panic vfs
  • asrock alivenf5 esata2
  • quake 2 download iso
  • egypt heart
  • opaska zwirowa wokol domu
  • bafford s bone collection
  • dorabianie;kluczykow;samochodowych;wroclaw
  • Katalog wypowiedzi z for internetowych ^^ Strona Główna