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
|
|